質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

728閲覧

RailsのDM機能でRoom.createを実行時にuser_idが渡せずNOT NULLエラーになる。

yuta00

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/12/16 08:36

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問