#はじめに
formオブジェクトを用いて、フォームから複数のテーブルに情報を保存する機能を実装する過程で、いちばん悩んだエラーについて、忘れないために記録しておく。
##想定している場面
ユーザーが商品を購入する。formに入力したものをデータベースに保存すると同時に、どの商品をどのユーザーが購入したかも保存する。つまり、フォームで「購入」を押した時に、2つのテーブルに保存される。
##mergeメソッドについて
ストロングパラメーターを設定するときに、使うメソッド。
使用例
private
def user_order_params
params.require(:user_order).permit(:postal_code, :prefecture_id).merge(user_id: current_user.id, item_id: params[:item_id])
end
user_id: current_user.id
のcurrent_userメソッドが使えるのは、deviseのGemを導入しているため。
item_id: params[:item_id]
で値を入れることができるのは、ルーティングをネストし、URLにitem_id
を含めているため。
ストロングパラメーターはprivateメソッド以下に記述する。
require
の引数は、モデル名。
permit
の引数は、DBのカラム名。
ターミナルで確認できるパラメーター
"user_order"=>{"hoge"=>"", "postal_code"=>"", "prefecture_id"=>"1"}, "commit"=>"購入", "controller"=>"orders", "action"=>"create", "item_id"=>"7"}
###mergeメソッドを使う場面
form_withでユーザーが記入した内容はハッシュの中に、キーと一緒に入っているが、ユーザーが記入しない内容も保存したい時。
例えば、ユーザーのidやその商品のidについては、ユーザーが直接入力することはないが、パラメーターに含めて、DBの保存したい。そのような時に、mergeメソッドを使って、パラメーターに含めたいキーと値を記述する。
上記の例では、user_idをcrrent_user.idから、item_idをURLに含めたparamsから取ってきて、パラメーターに含めている。
##最後に
エラーが解決できた時、マージかぁと一人呟いたとさ…。