2007年10月2日火曜日

明細行のtext_fieldなどをフォームで配列化する on Rails

明細行のtext_fieldなどをフォームで配列化する

ぺんちゃん日記にて、ヒントをいただいたけど、それじゃー新規のときはidがまだないからどうしたらいいの?って感じで。
ゴリゴリidにダミー値を入れてみたりしたけど、なんか気持ち悪くて、ActionView::helper.rbを調べてみた。ありました!

ヒントページ
ぺんちゃん日記

■例えば、家族情報を明細として持つとしたら








続柄名前年齢



(うぅ、テーブルがうまくレイアウトできない。。)

■これをRailsで表示

表示するだけなら、なんとでもなるけど、コントローラーで params[:family] で取得できたら、つまり params[:family][0] の中に続柄・名前・年齢が入っている Hash として取得できたらすごい楽。なわけ。

■ヒントページによると更新の場合は

<%= text_field("family[]", 'zokugara') %>
としておけば、id(例えば23だとする)が使用されて、

<input id="family_23_zokugara" name="family[23][zokugara]" size="30" type="text" value="1" />
と展開してくれる。

■でも新規登録もあるわけで

前は、コントローラーでidにダミー値(例えば"a"とか)を入れて、更新時と同じような動きにしていたが。
やっぱ、おかしい。気持ち悪い。

調べてみたら、:index => 0 みたいな感じで、options(html_optionsがある場合はそっち)に指定してやると、idの代わりに(優先的に)使用してくれる。

上記の例に適応してみるとRailsでは例えばこう書ける。

<% @families.each_with_index do |@family,index| %>
<tr>
<td>
<%= select('family[]', 'zokugara', [["ママ", "0"],["息子", "1"],["ペット", "1"]].freeze, {:include_blank => true}, :index => index) %>
</td>
<td>
<%= text_field 'family[]', 'name', :size => "20", :index => index %>
</td>
<td>
<%= text_field 'family[]', 'age', :size => "20", :index => index %>
</td>
</tr>
<% end %>

※@familiesはコントローラーで、ARモデルインスタンスを3つnewしたHashと思ってください。

これで思い通りに展開されて、コントローラーで楽にパラメータを取得できるようになる!

■まとめ

こんなことで悩んでいるのはわしだけか?
調べても、出てこなかったしな。
いまさら、RailsDocumentに載ってるわ。これ。