form_forすげぇ

form_forは、「モデルに対応するフォーム」って説明がよくわかんなかったけど。。コードにしてみてその威力が判明^^

(サンプル)
Commentっていうモデルがあって、コメントを投稿するみたいな処理。

viewは、まぁ普通。form_tagと大して変わらないような感じ。

  <% form_for(:comment, :url =>{:controller => 'comment', :action => 'post'}) do |f| -%>
    <%= f.hidden_field(:topic_id, {:value => @topic.id}) %>  

    <p><label for="user_id">投稿者&nbsp;
    <%= current_user.name %><%= current_user.division_name %></label>
    <%= f.hidden_field(:user_id, {:value => current_user.id}) %>  
    </p>

    <p><label for="rating_id">評価</label>
    <%= f.radio_button(:rating_id, "6", :checked => true) %><%= "評価しない" %><br />
    <%= f.radio_button(:rating_id, "5") %><%= "★★★★★" %><br />
    <%= f.radio_button(:rating_id, "4") %><%= "★★★★☆" %><br />
    <%= f.radio_button(:rating_id, "3") %><%= "★★★☆☆" %><br />
    <%= f.radio_button(:rating_id, "2") %><%= "★★☆☆☆" %><br />
    <%= f.radio_button(:rating_id, "1") %><%= "★☆☆☆☆" %><br />
    </p>

    <p><label for="body">コメント(500文字まで)</label><br/>
    <%= f.text_area(:body, {:id => 'comment_body', :size => "50*20"}) %>
    </p>

    <p><%= submit_tag '送信' %><input name="reset" type="reset" value="クリア" /></p>
  <% end -%>


で、controllerですよ。
(修正前)
まぁ普通に代入してるんだけど、これは、form_forの良さを活かしてない^^;

  def post
    comment = Comment.new()
    ActiveRecord::Base.transaction do
      comment.body = params[:comment][:body]
      comment.user_id = params[:comment][:user_id]
      comment.rating_id = params[:comment][:rating_id]
      comment.topic_id = params[:comment][:topic_id]
      comment.save!
    end
  end


(修正後)
5行くらいあったやつが1行ですよ!項目が少ないから5行だけど、項目多いモデルになったらこの威力は凄まじいね!
form_forの真価は、このviewとcontrollerの連携にあり!ってことですね。

  def post
    ActiveRecord::Base.transaction do
      comment = Comment.new(params[:comment])
      comment.save!
    end
  end