Rails 2.1 で、form_for 中の共通部分を部分テンプレートにできる。
# create.html.erb
<% form_for(@obj) do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<br />
<%= f.submit "Submit" %>
<% end %>
こんなヤツの場合、_form.html.erb を作って分離することができる。
# create.html.erb
<% form_for(@obj) do |f| %>
<%= render :partial => f %>
<br />
<%= f.submit "Submit" %>
<% end %>
# _form.html.erb
<%= form.label :name %>
<%= form.text_field :name %>
これはデフォルトのフォームビルダを使用している場合の話で、カスタムフォームビルダを使用している場合、少し話が変わる。
FormBuilder を継承した HogeFormBuilder を利用している場合はこんな風になる。
# create.html.erb
<% hoge_form_for(@obj) do |f| %>
<%= render :partial => f %>
<br />
<%= f.submit "Submit" %>
<% end %>
# _hoge_form.html.erb
<%= hoge_form.label :name %>
<%= hoge_form.text_field :name %>
ポイントは二つ。
- 部分テンプレートのファイル名が _hoge_form.html.erb とクラス名を考慮したファイル名が要求される。
- 部分テンプレートの中で使用される暗黙の変数が、hoge_form とこれまたクラス名を考慮したものになる。
一つ目は知っていたものの、二つ目で少しハマった。というわけでメモ