フォーム情報を取得してインスタンスを生成する、というのはアプリケーションの醍醐味です。
このフォームから送られた値を取得するためのparams
メソッドについて、つまづくことが多かったので、簡単に整理します。
例
オリジナルアプリ制作時のパラーメータを題材にしています。
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"6YAg0qEsGyxdHWJspI1f2sgzrztYo5cZhSkRHGBgLrVEHvMLdo3xBkJznCFlOIc/650K8ZntJVDWIZejLdQd9g==",
"post"=>{"product_id"=>"1", "title"=>"おいしい", "rate"=>"5", "content"=>"素晴らしい商品"},
まず、Parameterは上記のように格納されています。
言わずもがな、"キー"=>値
という形式です。
Postモデルのインスタンスであるpost
はキーとして機能しています。
post
というキーに対してハッシュで{"product_id"=>"1", "title"=>"おいしい", "rate"=>"5", "content"=>"素晴らしい商品"}
という値が保存されているわけです。
ややこしいですよね。
基本
postの中の値product_id
をPostモデルより取得しインスタンス変数を生成する場合を考えます。
@post = Post.find(product_id: params[:product_id])
応用
postの中の値'product_id'をProductモデルで取得しインスタンス変数を生成する場合を考えます。
前提として、ProductモデルとPostモデルは一対多の関係性にあります。
@product = Product.find(id: params[:post][:product_id])
パラメーターからProductモデルを探索す場合、まずは、キー値の[:post]を指定し、次にハッシュ値の中のキー値[:product_id]を指定する必要があります。
この時、[:post]を指定してあげないと、下記のようなエラーが出るので注意ですね。
ActiveRecord::RecordNotFound in PostsController
Couldn't find Product without an ID