前提・実現したいこと
rails6.0.3でマッチングサイトを作成しているのですが、
異なるユーザー同士が1対1でメッセージを送り合えるDM機能を実装するために
自分と相手ユーザーのトークルームをcreateできるようにしたいです。
データベース設計はユーザ情報を管理するuserと、トークルームを作成・表示するroomが多対多の関係になるため
中間テーブルのmessageとentryを作成しています。
データベースにはSQLite3.28を使用しています。
色々と調べたのですが解決に至りませんでした。
どなたかお力を貸していただけると幸いです。
発生している問題・エラーメッセージ
Rooms/Controllerのcreate実行時にuser_idがうまく渡せていないため
SQLiteのNOT NULL制約によってエラーとなっています。
create実行時にuser_idをうまく渡せるようにしたいです。
該当のソースコード
rooms/controller.rb
ruby
1class RoomsController < ApplicationController 2 before_action :authenticate_user! 3 4 def create 5 #form_forで送られてきたパラメーターをnewする 6 @room = Room.create 7 @room.save 8 #現在ログインしているユーザーのentry 9 @entry1 = Entry.create(room_id: @room.id, user_id: current_user.id) 10 #メッセージされる側のentry 11 #fields_forから送られてきたparams(:user_id, room_id)を許可する 12 @entry2 = Entry.create(params.require(:entry).permit(:user_id, :room_id)) 13 redirect_to "/rooms/#{@room.id}" #createしたらメッセージルームが表示される 14 end 15
users/show.html.erb
<% unless @user.id == current_user.id %> <% if @isRoom == true %> <!--すでにroomがあったら「メッセージへ」と表示してメッセージに飛ばす--> <p class="user-show-room"> <a href="/rooms/<%= @roomId %>" class="btn btn-primary btn-lg">メッセージへ</a> </p> <% else %> <%= form_for @room do |f| %> <%= fields_for @entry do |e| %> <%= e.hidden_field :user_id, value: @user.id %> <!-- ここからuser_idを飛ばしている --> <% end %> <%= f.submit 'メッセージを送る', class: "btn btn-primary btn-lg user-show-room" %> <% end %> <% end %> <% end %>
users/controller.rb
class UsersController < ApplicationController def index @users = User.all end def show @user = User.find(params[:id]) @posts = @user.posts @currentUserEntry = Entry.where(user_id: current_user.id) #ボタンを押したユーザーを探す @userEntry = Entry.where(user_id: @user.id) #ボタンを押されたユーザーを探す。 unless @user.id == current_user.id #現在ログインしているユーザーではない(自分に対してはroomを作成できない) @currentUserEntry.each do |cu| @userEntry.each do |u| if cu.room_id == u.room_id then #ルームがすでに作成されている場合 @isRoom = true #false(roomが未作成)の時にroomを作成する条件を記述するため @roomId = cu.room_id end end end if @isRoom #true(すでにroomがある)なら何も起きない else #false(room)が未作成なら新しいインスタンスを作成するためのnewを記述 @room = Room.new @entry = Entry.new end end end end
試したこと
①createメソッドにcurrent_user.idを渡してみた。
@room = Room.create(user_id: current_user.id)
⇨roomをcreateできるようになったが、自分対自分のroomができてしまう。
また、createを実行するたびに何度も新しいroomが作成されてしまう。
②null: falseを削除してみる。
create_room.rb
class CreateRooms < ActiveRecord::Migration[6.0] def change create_table :rooms do |t| t.references :user, foreign_key: true t.timestamps end end end
⇨エラー内容変わらず
補足情報(FW/ツールのバージョンなど)
rails6.0.3
SQLite3.28
ruby2.6.3
ブラウザ:chroom
エディタ:vscode
あなたの回答
tips
プレビュー