LoginSignup
1
2

More than 3 years have passed since last update.

【Ruby on Rails】 form_forのviewからDBに保存までの流れについて

Posted at

目次

  • viewからcontrollder→DBまで保存の流れ(require)
  • 2つのハッシュを結合する(mergeメソッド)

viewからcontrollder→DBまで保存の流れ

今回は商品レビューをDBに保存するとします。

html.erb
<%= 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(:カラム名)と記述します。

controller.rb
#ストロングパラメータ
def create_params
   #params.require(:テーブル名).permit(:カラム名, :カラム名)
    params.require(:review).permit(:title, :detail)
end

2つのハッシュを結合する(mergeメソッド)

前回はレビューを保存する流れをご説明しました。レビューは商品などに紐づいていることがほとんどなのでここでは、商品テーブル(products)のidをレビューテーブルに保存する流れについて記述します。

html.erb
<%= form_for [@product, @review] do |f| %>
 <%= f.text_field :title %>
 <%= f.text_area :detail %>
<% end %>

どのレビューがどの商品の(product_id)に紐づいているのかを明確にするためreviewsテーブルにproductsテーブルから取得したproduct_idも保存します。

controller
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が同じレコードに保存されるようになります。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2