Ruby on Railsでどんな時にform_forやform_tagを使い分けるの?というのというお話。
環境は、Rails 2.3.2
※筆者はまだ、Railsに慣れていません。注意して読んでください。ぜひ突っ込みを
form_tag はとりあえず<form>タグでPOSTとかしたい時に使う。
form_tag の類はヘルパー(ActionView::Helpers::FormTagHelper)
<% form_tag :action => "unko", :id => 1234 do %> <%= label_tag 'author' %>: <%= text_field_tag 'author' %><br /> <%= label_tag 'accept' %>: <%= check_box_tag 'accept' %><br /> <%= submit_tag "post!!" %> <% end %>
で、form_tagでモデルなんかにそのまま結果を入れたい時(CRUDとか、オブジェクトに関連付けたいとき?)は、text_field_tag などではなく、text_field の方を使う。
(って、こういう解釈であってますか?)
<% form_tag :action => "unko", :id => 1234 do %> <%= label :post, :author %>: <%= text_field :post, :author %> <%= error_messages_on :post, :author %><br /> <%= label :post, :accept %>: <%= check_box :post, :accept %> <%= error_messages_on :post, :accept %><br /> <%= submit_tag "post!!" %> <% end %>
また、最初のtext_fieldには、@post.authorの内容がデフォルト値(value=)として使われます。同様に、check_boxの値には@post.acceptが入ります。
(この辺はRailsのAPIドキュメントのtext_fieldやcheck_boxのHTMLの出力結果を見てみればわかります)
ここで1つ思うのは、:postという記述が冗長ですよね。
それを解決するのが form_for です。(でよいのか?)
form_forは類としてはActionView::Helpers::FormBuilderになる。
<% form_for @post, :url => {:action => "unko", :id => 1234} do |f|%> <%= f.error_messages %><br /> <%= f.label :author %>: <%= f.text_field :author %><br /> <%= f.label :accept %>: <%= f.check_box :accept %><br /> <%= f.submit "post!!" %> <% end %>
form_forの詳細はRailsのドキュメントの"form_for"のページある程度書いてあります。
ラジオボタンを表示する時に使う radio_button_tag はデフォルトのチェック状態を指定するには、引数の4番目に boolean を指定します。
例:
<%= radio_button_tag 'receive_updates', 'no', true %>
しかし、radio_button の方は、3番目の引数以降に、:checked => true でデフォルトのチェック状態指定します。
例:
<%= radio_button("user", "receive_newsletter", "yes", :checked => true) %>
書き換えようとしてハマるので注意。
No comment. Comments/Ruby/Ruby on Rails/form_forやform_tagなどの使い分け?