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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

1回答

374閲覧

送信したメッセージがDBに保存されない

AKIRA0310

総合スコア15

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2022/04/29 04:54

編集2022/04/29 12:12

前提・実現したいこと

DM機能の実装中なのですが、送信したメッセージがDBに保存されません。
どなたかご教授いただければ幸いです。

発生している問題・エラーメッセージ

イメージ説明

Started POST "/messages" for ::1 at 2022-04-29 13:20:48 +0900 Processing by MessagesController#create as HTML Parameters: {"authenticity_token"=>"4HCuuHQj7NdvfhD/JLswirzYc3oOTEsGh4d0JBwkA2B3eY2MacDZYNPhKmZmnGB3ACA7ocuKdjtf+WVCmLnX2A==", "message"=>{"message"=>"初めまして", "room_id"=>"1"}, "commit"=>"送信"} User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1 RoomUser Load (0.4ms) SELECT `room_users`.* FROM `room_users` WHERE `room_users`.`profile_id` = 2 AND `room_users`.`room_id` = 1 ↳ app/controllers/messages_controller.rb:6:in `create' (0.2ms) BEGIN ↳ app/controllers/messages_controller.rb:7:in `create' Room Load (0.3ms) SELECT `rooms`.* FROM `rooms` WHERE `rooms`.`id` = 1 LIMIT 1 ↳ app/controllers/messages_controller.rb:7:in `create' (0.3ms) ROLLBACK ↳ app/controllers/messages_controller.rb:7:in `create' Redirected to http://localhost:3000/rooms/1 Completed 302 Found in 11ms (ActiveRecord: 1.5ms | Allocations: 6792)

該当のソースコード

messages_controller.rb

ruby

1before_action :authenticate_user!, only: [:create] 2 3 def create 4 if RoomUser.where(profile_id: current_user.id, room_id: params[:message][:room_id]).present? 5 @message = Message.create(params.require(:message).permit(:profile_id, :message, :room_id).merge(profile_id: current_user.id)) 6 redirect_to room_path(@message.room_id) 7 else 8 flash[:alert] = "メッセージを送信できませんでした" 9 end 10 end

rooms_controller.rb

ruby

1before_action :authenticate_user! 2 3 def create 4 @room = Room.create 5 @roomUser1 = RoomUser.create(room_id: @room.id, profile_id: current_user.id) 6 @roomUser2 = RoomUser.create(params.require(:room_user).permit(:profile_id, :room_id).merge(room_id: @room.id)) 7 redirect_to room_path(@room.id) 8 end 9 10 def show 11 @room = Room.find(params[:id]) 12 if RoomUser.where(profile_id: current_user.id, room_id: @room.id).present? 13 @messages = @room.messages 14 @message = Message.new 15 @roomUsers = @room.room_users 16 else 17 redirect_back(fallback_location: root_path) 18 end 19 end

rooms/show.html.erb

ruby

1<div class="left-button"> 2 <%= link_to "一覧に戻る", root_path, class:"edit-link" %> 3</div> 4<% @roomUsers.each do |ru| %> 5 <div class="user-name"> 6 <strong> 7 <%= image_tag ru.profile.image.url, :size => '200x200', class:"user-image" %> 8 <a class="rooms-user-link" href="/profiles/<%= ru.profile.id %>"> 9 <%= ru.profile.nickname %>さん 10 </a> 11 </strong> 12 </div> 13<% end %> 14<hr> 15<div class="chats"> 16 <div class="chat"> 17 <% if @messages.present? %> 18 <% @messages.each do |m| %> 19 <div class="chat-box"> 20 <div class="chat-face"> 21 <%= image_tag m.profie.image.url, :size => '200x200', class:"user-image" %> 22 </div> 23 <div class="chat-hukidashi"> <strong><%= m.message %></strong> <br> 24 <%= m.created_at.strftime("%Y-%m-%d %H:%M")%> 25 </div> 26 </div> 27 <% end %> 28 <% end %> 29 </div> 30 <div class="posts"> 31 <%= form_with model: @message, local: true do |f| %> 32 <%= f.text_field :message, placeholder: "メッセージを入力して下さい" , size: 70, class:"form-text-field" %> 33 <%= f.hidden_field :room_id, value: @room.id %> 34 <%= f.submit "送信",class:"form-submit"%> 35 <% end %> 36 </div> 37</div>

routes.rb

ruby

1Rails.application.routes.draw do 2 devise_for :users 3 root to: "profiles#index" 4 resources :profiles 5 resources :users, only: [:edit, :update] 6 resources :messages, only: [:create] 7 resources :rooms, only: [:create, :show] 8end

messages.rb

ruby

1create_table :messages do |t| 2 t.text :message 3 t.references :profile, null: false, foreign_key: true 4 t.references :room, null: false, foreign_key: true 5 t.timestamps 6end

room_users.rb

ruby

1create_table :room_users do |t| 2 t.references :profile, null: false, foreign_key: true 3 t.references :room, null: false, foreign_key: true 4 t.timestamps 5end

自分で調べたことや試したこと

エラー画面が出なかったので、ターミナルログを見るとパラメーターに情報は入っているものの、createのところでrollbackされていました。paramsやカラムの表記を確認しましたが原因を見つけられず、302ステータスコードについても見てみましたが結局よくわかりませんでした。どなたかお力をお貸しいただければ幸いです。

使っているツールのバージョンなど補足情報

Rails 6.0.0
Ruby 2.6.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

画像貼り付けですと潰れて読めません、検索とかもできないし、Textで貼り直してください。
validationで引っかかってるのではないかと思いますがその確認のため、一時的に Message.createMessage.create! にしてみてください。

投稿2022/04/29 05:28

winterboum

総合スコア23329

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

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

AKIRA0310

2022/04/29 08:32

Textで貼り直しましたのでご確認お願いします。 rooms_controller @message = Message.create!(params.require(:message).permit(:profile_id, :message, :room_id).merge(profile_id: current_user.id)) この記述でよろしいでしょうか?
winterboum

2022/04/29 08:47

はい、それでmessageをsaveするとなんでrollbackするか、表示されます
winterboum

2022/04/29 08:49

画像代わりのtextですが、ちと読みにくいので プログラムと同じように ``` でくくってください
AKIRA0310

2022/04/29 11:20 編集

``` Started POST "/messages" for ::1 at 2022-04-29 13:20:48 +0900 Processing by MessagesController#create as HTML Parameters: {"authenticity_token"=>"4HCuuHQj7NdvfhD/JLswirzYc3oOTEsGh4d0JBwkA2B3eY2MacDZYNPhKmZmnGB3ACA7ocuKdjtf+WVCmLnX2A==", "message"=>{"message"=>"初めまして", "room_id"=>"1"}, "commit"=>"送信"} User Load (0.4ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1 RoomUser Load (0.4ms) SELECT `room_users`.* FROM `room_users` WHERE `room_users`.`profile_id` = 2 AND `room_users`.`room_id` = 1 ↳ app/controllers/messages_controller.rb:6:in `create' (0.2ms) BEGIN ↳ app/controllers/messages_controller.rb:7:in `create' Room Load (0.3ms) SELECT `rooms`.* FROM `rooms` WHERE `rooms`.`id` = 1 LIMIT 1 ↳ app/controllers/messages_controller.rb:7:in `create' (0.3ms) ROLLBACK ↳ app/controllers/messages_controller.rb:7:in `create' Redirected to http://localhost:3000/rooms/1 Completed 302 Found in 11ms (ActiveRecord: 1.5ms | Allocations: 6792) ```
AKIRA0310

2022/04/29 11:22

``` Started POST "/messages" for ::1 at 2022-04-29 17:28:59 +0900 Processing by MessagesController#create as HTML Parameters: {"authenticity_token"=>"LU+X8Ud7ZvLW8gPoLK3wesQ1X0UbUvvEN8RwWo72LbW6RrTFWphTRWptOXFuiqCHeM0Xnt6UxvnvumE8Cmv5DQ==", "message"=>{"message"=>"初めまして", "room_id"=>"1"}, "commit"=>"送信"} User Load (24.5ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1 RoomUser Load (1.3ms) SELECT `room_users`.* FROM `room_users` WHERE `room_users`.`profile_id` = 2 AND `room_users`.`room_id` = 1 ↳ app/controllers/messages_controller.rb:6:in `create' (34.5ms) BEGIN ↳ app/controllers/messages_controller.rb:7:in `create' Room Load (0.7ms) SELECT `rooms`.* FROM `rooms` WHERE `rooms`.`id` = 1 LIMIT 1 ↳ app/controllers/messages_controller.rb:7:in `create' (23.5ms) ROLLBACK ↳ app/controllers/messages_controller.rb:7:in `create' Completed 422 Unprocessable Entity in 132ms (ActiveRecord: 84.5ms | Allocations: 36964) ActiveRecord::RecordInvalid (Validation failed: User must exist): app/controllers/messages_controller.rb:7:in `create' ``` すみません こちらがMessage.create!で出たログになります
winterboum

2022/04/29 11:54

``` でくくるのは コメントではなくて 質問欄の方です。 で、create! の方ではなぜだめなのかメッセージされてますね。 ActiveRecord::RecordInvalid (Validation failed: User must exist): って ん? User ? Profile じゃなくて。はて
AKIRA0310

2022/04/29 12:27

すみません、質問を編集し直しました。 ということはuserとprofileのルーティングやアソシエーションに問題があるのでしょうか?
winterboum

2022/04/29 13:26

User、 Profile、Message、Room のmodel定義を載せてください。app/models/users.rb などです
AKIRA0310

2022/04/29 13:52 編集

かしこまりました User.rb class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_one :profile end Room.rb class Room < ApplicationRecord has_many :room_users, dependent: :destroy has_many :profiles, through: :room_users has_many :messages, dependent: :destroy end RoomUser.rb class RoomUser < ApplicationRecord belongs_to :profile belongs_to :room end Profile.rb class Profile < ApplicationRecord mount_uploader :image, ImageUploader belongs_to :user has_many :room_users, dependent: :destroy has_many :rooms, through: :room_users has_many :messages, dependent: :destroy validates :nickname, presence: true end Message.rb class Message < ApplicationRecord belongs_to :user belongs_to :room end こちらです
winterboum

2022/04/29 14:11

プログラムは ```をつかって質問欄に書いてください。インデントなどが狂うので読みにくい Message.rb class Message < ApplicationRecord belongs_to :user ここですね。user じゃないでしょ
AKIRA0310

2022/04/29 14:36

何度も申し訳ないです。 なるほど、確かにそうですね。そこに気付けず悔しい... profileに直したらうまくいきました。 前回に引き続きお世話になりました。ありがとうございました。
winterboum

2022/04/30 02:40

エラーメッセージは丁寧に読みましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問