【DM機能実装】DBに保存できない件についての質問
解決したいこと
Ruby on Railsでユーザー(企業と個人)のDM機能実装中です。
新規でチャットルームを作成する際、entriesテーブル(ユーザー同士の組み合わせを保存するテーブル)にデータが保存されず困っています。
初学者のためわかりづらいかもしれませんが、ご意見いただけますと幸いです。
■前提条件
ファーストコンタクトは企業側のみ可能(新規チャットルームを作成できるのは企業側のみ)
■テーブル
①usersテーブル(個人)
②adminsテーブル(企業)
③roomsテーブル(①②の組み合わせを記録)
④entriesテーブル(①②③の組み合わせを記録)
①、②はdeviseを使用しています。
■実現したいこと
①ユーザー詳細ページからDMボタンを押下すると新しくチャットルームが作成される(DBに同じユーザー同士の組み合わせのチャットルームがない場合)
②DMを送る企業、DMを送られる個人、①で作成したチャットルームそれぞれのidをentriesテーブルに保存
③チャットルームに遷移
■処理の流れ
---ユーザー詳細ページ---
①「DMを送る」ボタンを押下することで、詳細ページで表示されているユーザーのidと、ログイン中の企業id(current_admin.id)がroomsコントローラーに送られる
---roomsコントローラー---
②room = Room.createにより新規チャットルーム作成
③ストロングパラメーターを用い、①から送られてきたuser_idとadmin_id、②で作成された@room.idを受け取りEntryをcreate
■問題点
①
entriesテーブルに必要となる、user_id、admin_id、room_idは取得できていますが、コンソールで表示するとcreated_atやupdated_atカラムがnilとなります。
同じくコンソール上で @entry = Entry.new(user_id: 1, admin_id: 1, room_id: 1) のようにしても同様の結果となります。
②
ネットで検索して他の方のコードを参考にさせていただいておりますが、
@room = Room.create に関しては、ストロングパラメーターを使用したり、createメソッドの後にカラムの情報を記述しない点も理解できておりません。
自分の場合、DBにuser_id、admin_idがnullのまま保存されてしまいます。(そもそも外部キー参照をしているのにnullで保存されていることが問題?)
③
保存後の処理である redirect_to room_path(@room.id) が実行されず?ユーザー詳細ページに戻される
該当するソースコード
【show.html.erb】
<%= form_with model: @room, local: true do |f| %>
<%= fields_for @entry do |e| %>
<%= e.hidden_field :user_id, value: @user.id %>
<%= e.hidden_field :admin_id, value: current_admin.id %>
<% end %>
<%= f.submit "ダイレクトメッセージ" %>
<% end %>
DMを送る企業、DMを送られる個人のidを送信
※@user = User.find(params[:id]
【rooms_controller.rb】
def create
@room = Room.create
@entryAdmin = Entry.create(join_room_params)
redirect_to room_path(@room.id)
end
private
def join_room_params
params.require(:entry).permit(:user_id, :admin_id, :room_id).merge(room_id: @room.id)
end
新しくチャットルームを作成
自分で試したこと
■createアクション内でbinding.pryを用いて色々出力してみる
①params
"user_id"=>"1", "admin_id"=>"1"
②@room
id: 23, user_id: nil, admin_id: nil, created_at: Mon, 15 Mar 2021 21:08:32 JST +09:00, updated_at: Mon, 15 Mar 2021 21:08:32 JST +09:00
③@entryAdmin
id: nil, user_id: 1, admin_id: 1, room_id: 23, created_at: nil, updated_at: nil
■ストロングパラメーターを使用しない
@entryAdmin = Entry.create(join_room_params)
ではなく
@entryAdmin = Entry.create(admin_id: current_admin.id, user_id: params[:user_id], room_id: @room.id)
とするも、今度は@entryAdminにuser_idが渡せなくなる。
---考察---
問題点②にも挙げさせていただきましたが、必要な情報を持たせてもcreated_atやupdated_atの情報を持たず保存できないということは、
マイグレーションファイルなどに問題があるのでは?と疑っています。
試行錯誤してみますが、もし何かご意見をいただければと思い投稿させていただきました。