#目次
- viewからcontrollder→DBまで保存の流れ(require)
- 2つのハッシュを結合する(mergeメソッド)
###viewからcontrollder→DBまで保存の流れ
今回は商品レビューをDBに保存するとします。
<%= form_for(@review) do |f| %>
<%= f.text_field :title %>
<%= f.text_area :detail %>
<% end %>
コンソールでPryをおこなって確認する
params
{ review: { title: "入力された名前", detail: "入力された詳細" } }
キーはform_forの引数にあるインスタンスの モデル名(review) になり、バリューはカラム名と入力された値のハッシュです。
paramsからキーがreviewのバリューを取得し、createアクションの引数に渡せるようにストロングパラメーターを定義するには以下のようにします。
params
{ review: { review: { title: "入力された名前", detail: "入力された詳細" }
params.require(:review)
=> { review: { title: "入力された名前", detail: "入力された詳細" }
※form_tagを使用して入力情報を保存した場合のストロングパラメーターとしてparams.permit(:キー名)という記述をしますが、params.require(:モデル名).permit(:カラム名)と記述します。
#ストロングパラメータ
def create_params
#params.require(:テーブル名).permit(:カラム名, :カラム名)
params.require(:review).permit(:title, :detail)
end
###2つのハッシュを結合する(mergeメソッド)
前回はレビューを保存する流れをご説明しました。レビューは商品などに紐づいていることがほとんどなのでここでは、商品テーブル(products)のidをレビューテーブルに保存する流れについて記述します。
<%= form_for [@product, @review] do |f| %>
<%= f.text_field :title %>
<%= f.text_area :detail %>
<% end %>
どのレビューがどの商品の(product_id)に紐づいているのかを明確にするためreviewsテーブルにproductsテーブルから取得したproduct_idも保存します。
def new
@product = Product.find(params[:product_id])
@review = Review.new
end
def create
Review.create(create_params)
end
#ストロングパラメータ
private
def create_params
params.require(:review).permit(:rate, :review).merge(product_id: params[:product_id])
end
###mergeメソッド
mergeメソッドは2つのハッシュを統合する時に使うメソッドです。
hash1 = {カラム1: "内容"}
hash2 = {カラム2: "内容2", カラム3: "内容3"}
hash1.merge(hash2)
#=> {:カラム1=>"内容", :カラム2=>"内容2", :カラム3=>"内容3"}
これでreviewsテーブルにレビューと商品idが同じレコードに保存されるようになります。