render で controller を指定できない件
人によってはどーでもいい話なんでしょうけど。
# comment_controller.rb の一部 def create @comment = Comment.new(params[:comment]) @entry = Entry.find(:first, :conditions => ["id = ?", @comment.entry_id]) if_found(@entry) do if @comment.save redirect_to @entry else render :controller => "entries", :action => "show", :id => @entry.id end end end
ありがちな新規レコードの作成です。実際は Akismet によるチェックをかけていますが、そこは省略。if_found は適切な記事が指定されたかどうかのフィルタで、記事が見つからない場合 404 を返します。
さて、実はこのコード、意図したとおりに動作しません。コメントが invalid な場合、 comments_controller の show メソッドにレンダリングされてしまいます。API を確認すると、確かにコントローラに関する記述はないし、かといって redirect_to にしてしまうと何が invalid なのか表示する事ができません。
しかし、普通の blog って記事を参照(entries/show)できるページからコメントが投稿できるはずだし、コメントの作成を行うなら comment_controller の create メソッドで行うべきだと思いません?単に entries_controller に create_comment というメソッドを作ればいい話なんですが、それも何となく気持ち悪いです。