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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

1回答

646閲覧

Ruby on Railsでデータベースにデータを保存できない

hazumi

総合スコア1

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2021/06/01 15:29

前提・実現したいこと

こんにちは。プログラミング初心者で、現在、Rubyを使用し、チャット機能を作成しています。
メッセージと共に、ActiveHashを利用した項目を選択し、送信する機能を実装しようとしていますが、送信した内容がデータベースに保存できません。データベースは、MySqlを使用しています。
エラーメッセージが出ていないので、どこが間違っているのかわからず、質問させていただきました。

該当のソースコード

controller

1class MessagesController < ApplicationController 2 def index 3 @message = Message.new 4 @room = Room.find(params[:room_id]) 5 @messages = @room.messages.includes(:user) 6 end 7 8 def create 9 @room = Room.find(params[:room_id]) 10 @message = @room.messages.new(message_params) 11 @message.save 12 end 13 14 private 15 16 def message_params 17 params.require(:message).permit(:image, :content, :heat_id, :condition_id).merge(user_id: current_user.id) 18 end 19end

model

1class Condition < ActiveHash::Base 2 self.data = [ 3 { id: 1, name: '体調' }, 4 { id: 2, name: '良い' }, 5 { id: 3, name: '普通' }, 6 { id: 4, name: '悪い' } 7 ] 8 9 include ActiveHash::Associations 10 has_many :messages 11end 12

model

1class Heat < ActiveHash::Base 2 self.data = [ 3 { id: 1, name: '体温' }, 4 { id: 2, name: '35.5度' }, 5 { id: 3, name: '35.6度' }, 6 { id: 4, name: '35.7度' }, 7 { id: 5, name: '35.8度' }, 8 { id: 6, name: '35.9度' }, 9 { id: 7, name: '36.0度' }, 10 { id: 8, name: '36.1度' }, 11 { id: 9, name: '36.2度' }, 12 { id: 10, name: '36.3度' }, 13 { id: 11, name: '36.4度' }, 14 { id: 12, name: '36.5度' }, 15 { id: 13, name: '36.6度' }, 16 { id: 14, name: '36.7度' }, 17 { id: 15, name: '36.8度' }, 18 { id: 16, name: '36.9度' }, 19 { id: 17, name: '37.0度' }, 20 { id: 18, name: '37.1度' }, 21 { id: 19, name: '37.2度' }, 22 { id: 20, name: '37.3度' }, 23 { id: 21, name: '37.4度' }, 24 { id: 22, name: '37.5度以上' } 25 ] 26 27 include ActiveHash::Associations 28 has_many :messages 29end

model

1 belongs_to :room 2 belongs_to :user 3 extend ActiveHash::Associations::ActiveRecordExtensions 4 belongs_to :heat 5 belongs_to :condition 6 7 with_options presence: true do 8 validates :heat_id 9 validates :condition_id 10 validates :content 11 end 12 13 with_options numericality: { other_than: 1, message: '選択してください' } do 14 validates :heat 15 validates :condition 16 end 17 18end 19

html

1<div class="chat-header"> 2 <div class="left-header"> 3 <div class="header-title"> 4 *<%= @room.room_name %>さんの連絡ルーム* 5 </div> 6 </div> 7 <div class="right-header"> 8 <div class="header-button"> 9 <a class="btn btn-danger" href="#">ルームを終了する</a> 10 </div> 11 </div> 12</div> 13 14<div class="messages"> 15 <%= render partial: 'message', collection: @messages %> 16</div> 17 18<%= form_with model: [@room, @message], class: 'form', local: true do |f| %> 19 <div class="form-input"> 20 <%= f.collection_select(:heat_id, Heat.all, :id, :name, {}, {class:"form-control", id:"select-box"}) %> 21 <%= f.collection_select(:condition_id, Condition.all, :id, :name, {}, {class:"form-control", id:"select-box"}) %> 22 <%= f.text_area :content, class: "form-control", placeholder:"メッセージを入力", id:"content", rows:"3" %> 23 <label class="form-image"> 24 <span class="btn btn-outline-dark">画像</span> 25 <%= f.file_field :image, class: "hidden" %> 26 </label> 27 </div> 28 <%= f.submit '送信', class:"btn btn-info"%> 29<% end %>

html

1<div class="wrapper"> 2 <div class="side-bar"> 3 <%= render "side_bar" %> 4 </div> 5 <div class="chat"> 6 <%= render "main_chat" %> 7 </div> 8</div>

html

1<div class="message"> 2 <div class="upper-message"> 3 <div class="message-user"> 4 <%= message.user.name %> 5 </div> 6 <div class="message-date"> 7 <%= message.created_at %> 8 </div> 9 <div class="message-heat"> 10 <%= message.heat_id %> 11 </div> 12 <div class="message-condition"> 13 <%= message.condition_id %> 14 </div> 15 </div> 16 <div class="lower-message"> 17 <div class="message-content"> 18 <%= message.content %> 19 </div> 20 </div> 21</div>

試したこと

messages.controller.rbのcreateアクションで、@message = @room.messages.new(message_params)の直前にbinding.pryを記述し、paramsを確認しました。

8: def create 9: @room = Room.find(params[:room_id]) => 10: binding.pry 11: @message = @room.messages.new(message_params) 12: @message.save 13: end [1] pry(#<MessagesController>)> params => <ActionController::Parameters {"authenticity_token"=>"JFb43g/X7GC/a9hJFElMb99vkZgNrtsB6u/FnsuoC6Qii347rpkuda5+8GO6HE+K3YonsnNmZhbr9+4Ir6cx2w==", "message"=>{"heat_id"=>"13", "condition_id"=>"2", "content"=>"test"}, "commit"=>"送信", "controller"=>"messages", "action"=>"create", "room_id"=>"1"} permitted: false> [2] pry(#<MessagesController>)>

パラメーターは問題なく送られていると思いました。
また、サーバーの再起動も行ってみましたが、変化はありませんでした。
他に考えられる問題や修正点を教えていただきたいです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージが表示されないのは、表示するようにviewが出来ていないからです。
とりあえず一時的に @message.save@message.save! と ! 付きで試してください。エラーメッセージがでます。

投稿2021/06/01 16:17

winterboum

総合スコア23567

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

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

hazumi

2021/06/02 02:37

回答ありがとうございます。 !をつけて実行したところ、【バリデーションに失敗しました: HeatSelect, ConditionSelect】というメッセージが表示されました。 binding.pryをし、@room.messages.new(message_params)の中をターミナルで確認すると、 id: nil, content: "test", heat_id: 20, condition_id: 3, room_id: 1, user_id: 1, created_at: nil, updated_at: nil> という結果が出ました。 id= nilになっていたので調べたところ、外部キーにoptional: trueと記述すると直るとありました。実行してみましたが、同じエラー文が出てしまいます。 他にやり方を教えていただけますでしょうか。
hazumi

2021/06/02 07:31

解決できました! idがnilだったので、モデルをよく見たところ、heat_id, condition_idとするところがheat, conditionになっていました。 エラー分表示方法を教えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問