ネストされたリソースに対してform_for
課題
Railsのルーティングでよくある
- 管理画面のURLを
/admin/~
にしたい - 1:NのリソースをURLでも表現したい
といった場合
# routes.rb
scope '/admin' do
resources :topics do
resources :comments
end
end
これで/admin/topics/:topic_id/comments
というルーティングが出来るわけですが、Commentモデルのform_forを書こうとした場合に問題が起こります。
# View
= form_for @comment
これだと NoMethodError - undefined method 'comments_path'
とエラーになってしまいます。
form_forは引数に渡したオブジェクトから自動でaction属性のURLを生成しますが、ルーティングまでは考慮してくれません。
解決方法
ルーティングでネストされたリソースに対してform_forを書くには引数を配列にしてネストを表現します。
# View
= form_for [:admin, @topic, @comment]
<!-- 出力されるHTML -->
<form action="/admin/topics/1234/comments" method="post">