Rails DM機能その2(DM投稿画面)の続きです。
開発環境
Mac
Ruby 2.6.5
Rails 6.1.3.2
<%= form_for @message do |f| %>
<%= f.text_field :content, :placeholder => "メッセージを入力して下さい" , :size => 70 %>
<%= f.hidden_field :room_id, :value => @room.id %>
<%= f.submit "投稿する" %>
<% end %>
class MessagesController < ApplicationController
def create
if Entry.where(user_id: current_user.id, room_id: params[:message][:room_id]).present?
@message = Message.create(params.require(:message).permit(:user_id, :content, :room_id).merge(user_id: current_user.id))
else
flash[:alert] = "メッセージ送信に失敗しました。"
end
redirect_to "/rooms/#{@message.room_id}"
end
end
コードの解説
まず、form_forで送られてきた:messageと:room_idのキーがちゃんと入っているか確認します。[:message]には作ったメッセージに渡されたルームidとコンテンツが入っています。
条件がtrueだったら、Message.createでメッセージを保存して、Messagesテーブルにuser_id、:content(ユーザーが入力したメッセージの内容)、room_idのパラメーターとして送られてきた値を許可します。
メッセージを送ったのは現在ログインしているユーザーなので、そのuser_idの情報をmergeさせます。
form_withでユーザーが記入した内容はハッシュの中に、キーと一緒に入っているが、ユーザーが記入しない内容もDBに保存したい時にmergeメソッドを使います。
参考記事
RailsでややこしいDM機能を1万字でくわしく解説してみた
RailsでDM(ダイレクトメッセージ)を送れるようにしよう
rails DM機能 メッセージ編
mergeメソッドについて改めて理解を深めた