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

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

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

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

Ruby on Rails 6

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

解決済

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

AKIRA0310
AKIRA0310

総合スコア15

Ruby

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

Ruby on Rails 6

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

1回答

0評価

0クリップ

137閲覧

投稿2022/04/29 04:54

編集2022/04/30 11:40

前提・実現したいこと

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

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

rooms_controller.rb

ruby

before_action :authenticate_user! def create @room = Room.create @roomUser1 = RoomUser.create(room_id: @room.id, profile_id: current_user.id) @roomUser2 = RoomUser.create(params.require(:room_user).permit(:profile_id, :room_id).merge(room_id: @room.id)) redirect_to room_path(@room.id) end def show @room = Room.find(params[:id]) if RoomUser.where(profile_id: current_user.id, room_id: @room.id).present? @messages = @room.messages @message = Message.new @roomUsers = @room.room_users else redirect_back(fallback_location: root_path) end end

rooms/show.html.erb

ruby

<div class="left-button"> <%= link_to "一覧に戻る", root_path, class:"edit-link" %> </div> <% @roomUsers.each do |ru| %> <div class="user-name"> <strong> <%= image_tag ru.profile.image.url, :size => '200x200', class:"user-image" %> <a class="rooms-user-link" href="/profiles/<%= ru.profile.id %>"> <%= ru.profile.nickname %>さん </a> </strong> </div> <% end %> <hr> <div class="chats"> <div class="chat"> <% if @messages.present? %> <% @messages.each do |m| %> <div class="chat-box"> <div class="chat-face"> <%= image_tag m.profie.image.url, :size => '200x200', class:"user-image" %> </div> <div class="chat-hukidashi"> <strong><%= m.message %></strong> <br> <%= m.created_at.strftime("%Y-%m-%d %H:%M")%> </div> </div> <% end %> <% end %> </div> <div class="posts"> <%= form_with model: @message, local: true do |f| %> <%= f.text_field :message, placeholder: "メッセージを入力して下さい" , size: 70, class:"form-text-field" %> <%= f.hidden_field :room_id, value: @room.id %> <%= f.submit "送信",class:"form-submit"%> <% end %> </div> </div>

routes.rb

ruby

Rails.application.routes.draw do devise_for :users root to: "profiles#index" resources :profiles resources :users, only: [:edit, :update] resources :messages, only: [:create] resources :rooms, only: [:create, :show] end

messages.rb

ruby

create_table :messages do |t| t.text :message t.references :profile, null: false, foreign_key: true t.references :room, null: false, foreign_key: true t.timestamps end

room_users.rb

ruby

create_table :room_users do |t| t.references :profile, null: false, foreign_key: true t.references :room, null: false, foreign_key: true t.timestamps end

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

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

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

Rails 6.0.0
Ruby 2.6.5

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

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

Ruby on Rails 6

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