【プログラミング】form_withについて

こんにちは!

今週は自分が理解に苦しんだform_withについて書いていきます!

 

%= form_with model: [@room, @message], class: 'form', local: true do |f| %>
こんな感じでmodelオプションに2つのインスタンス変数が入っているパターン。
自分が持った疑問は、なぜ2つの値が指定されているの??でした。
 

結論、

@roomと@messageは、formで入力した内容が

どこのモデルと紐づくのかを示しているから。(、、、と自分なりに解釈)

@messageは空のインスタンスのため、createアクションの発火にも一役買っている!

@roomは、既にidを取得しているため、@messageが紐づくべきレコードを示してくれている!

 

ちなみにモデル間では下記のアソシエーションが組まれている。

roomモデル        has_many: messages

messageモデル belongs_to: room belongs_to: user

 

せっかくなので保存までの流れも自分なりの解釈で書いていきます!

formで送られる内容(パラメーター)はこうなっている。(一部省略)

parameters: {"messages"=> { "content"  :  "入力した値"   }   "room_id"  =>  "●"}
このパラメーターがmessageコントローラーのcreateアクションへ運ばれる。
 
def create
@room = Room.find(params[:room_id])
@message = @room.messages.new(params_message)
if @message.save
redirect_to action: :index
else
@messages = @room.messages.includes(:user)
render action: :index
end
private

def params_message
params.require(:message).permit(:content, :image).merge(user_id: current_user.id)
end

パラメーターの中のroom_idはparamsで受け取られ,

入力した値は、params_messageメソッド(ストロングパラメーター)を通して、@messageに代入される。

そしてsaveメソッドでデータベースに保存される!

 

こんな感じの流れで動いている、、、はず!!

解釈が間違えていたら教えてください😹

学習を開始して3週間、段々と内容が複雑に感じてきました、、、が負けません!

 

ここまで読んでくださりありがとうございました!!!1