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">投稿者 <%= 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