ネストしたresourceでform_forに与える引数

config/routes.rbが

resources :hoges do
  resources :fugas
end

のようにネストしたresourceのとき、子となるfugaのみ作成/更新を行うフォームを書こうとして、少しハマったのでメモ。

次のヘルパーメソッドでは、

new_hoge_fuga_path(@fuga.hoge, @fuga) 
edit_hoge_fuga_path(@fuga.hoge, @fuga) 

以下のURLが呼ばれる。

http://localhost/hoges/:hoge_id/fugas/new
http://localhost/hoges/:hoge_id/fugas/:id/edit

このときに使用されるフォームは、

app/views/fugas/_form.html.erb

で、ここに書くform_forヘルパーの引数は、

<%= form_for([ @fuga.hoge, @fuga ]) do |f| %>

<%# 親のIDがほしい場合はhidden_field_tagで仕込んでおく %>
<%= hidden_field_tag "hoge_id", @fuga.hoge_id %>
...

とすればよいらしい。親と子を配列にする。これよりよい方法があれば知りたいところ。親と子を同時に作成/更新するフォームについてはfields_forでググるといろいろ見つかると思う。

2012/4/4追記
ソースコード内で「親のIDがほしい場合はhidden_field_tagで仕込んでおく」と書いているが、上記のようにしていた場合、formタグのaction属性に"/hoges/1/fugas/1"といったURLが設定されるので、hidden_field_tagで仕込まずとも親のIDが取得可能です。id:yamitzkyさん、ご指摘ありがとうございました。