概要
映画の詳細ページから、その映画に対するレビューが書けるアプリケーションを作成する。
つまり、
レビューするには、reviews_controller.rbのnewアクションでreviewインスタンスを生成。createメソッドで保存する必要がある。
作成したファイルは以下。
config/routes.rb
resources :users do
resources :products do
resources :reviews
end
end
new.html.erb
<%= form_for ( [@user, @product, @review ] ) do |f| %>
(中略)
<% end %>
review_controller.rb
def new
@user = User.find(4)
@product = Product.find(2)
@review = Review.new
end
疑問
new.html.erbファイルで引数を3つ指定している。この引数がどのように処理されているのか不透明であったので、調べてみた。
このアプリケーションの場合、レビューをするには、
new.html.erbのform_forメソッドから情報を入力し、送信する。
送信先のURLは、新規レビューであるから
/users/:user_id/products/:product_id/reviews
となる。
form_forメソッドに引数としてreviewインスタンスを渡すだけでは、user_idとproduct_idが指定されずエラーとなる。
form_forメソッドに引数として保存されたuserインスタンスとproductインスタンスを渡すことで、自動的にパスを指定してくれる。
結論
form_forメソッド便利。
参考
山田祥寛 Ruby on Rails4 アプリケーションプログラミング 技術評論社 2015年5月 第1版 p.104