🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

保存

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

Q&A

解決済

1回答

1364閲覧

Ruby: 保存されない場合

sasa_nagare

総合スコア2

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

保存

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

0グッド

0クリップ

投稿2021/02/08 12:50

前提・実現したいこと

特定のユーザーが作成したチャットルームに1:1でチャットが出来るようにしたい

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

発言内容が空の場合、データベースに保存されないようバリデーションをかけると以下のエラーになります。

NoMethodError in Messages#create Showing (省略)views/messages/_side_bar.html.erb where line #14 raised: undefined method `exists?' for nil:NilClass <div class="room"> <ul class="room-name"> <% if @rooms.exists? %> <% @rooms.each do |room| %> <li class="list"> <%= link_to room_messages_path(room) do %> Request Parameters: {"authenticity_token"=>"(省略)==", "message"=>{"content"=>""}, "commit"=>"送信", "room_id"=>"1"}

該当のソースコード

MessageModel

1class Message < ApplicationRecord 2 belongs_to :room 3 belongs_to :user 4 5 validates :content, presence: true 6end

MessagesController

1class MessagesController < ApplicationController 2 def index 3 @message = Message.new 4 @room = Room.find(params[:room_id]) 5 @rooms = Room.all.includes(:user) 6 @messages = @room.messages.includes(:user) 7 end 8 9 def create 10 @room = Room.find(params[:room_id]) 11 @message = @room.messages.new(message_params) 12 if @message.valid? 13 @message.save 14 redirect_to room_messages_path(@room) 15 else 16 @messages = @room.messages.includes(:user) 17 render :index 18 end 19 end 20 21 private 22 23 def message_params 24 params.require(:message).permit(:content).merge(user_id: current_user.id) 25 end 26end

index

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>

message

1<div class="message"> 2 <div class="upper-message"> 3 <div class="message-user"> 4 <%= message.user.nickname %> 5 </div> 6 <div class="message-date"> 7 <%= l message.created_at %> 8 </div> 9 </div> 10 <div class="lower-message"> 11 <div class="message-content"> 12 <%= message.content %> 13 </div> 14 </div> 15</div>

sidebar

1<div class="side-bar-header"> 2 <div class="side-header-title"> 3 <a href="#">Idea Trade</a> 4 </div> 5 <div class="create-room"> 6 <%= link_to "チャットを作成する", new_room_path %> 7 </div> 8</div> 9 10 11<div class="rooms"> 12 <div class="room"> 13 <ul class="room-name"> 14 <% if @rooms.exists? %> 15 <% @rooms.each do |room| %> 16 <li class="list"> 17 <%= link_to room_messages_path(room) do %> 18 <%= room.name %> 19 <% end %> 20 </li> 21 <% end %> 22 <% end %> 23 </ul> 24 </div> 25</div> 26 27<div class="rooms-f"> 28 <div class="user-name"> 29 <%= link_to current_user.nickname, edit_user_path(current_user) %> 30 </div> 31</div>

mainchat

1 2(省略) 3 4<div class="messages"> 5 <%= render partial: 'message', collection: @messages %> 6</div> 7 8<%= form_with model: [@room, @message], class: 'form', local: true do |f| %> 9 <div class="form-input"> 10 <%= f.text_field :content, class: 'form-message', placeholder: 'type a message' %> 11 <label class="form-image"> 12 <span class="image-file">画像</span> 13 <%= f.file_field :image, class: 'hidden' %> 14 </label> 15 </div> 16 <%= f.submit '送信', class: 'form-submit' %> 17<% end %>

試したこと

仮説として、エラー文で指摘されているexists?メソッドが空で定義されてないとありますが、そこよりもコントローラーの保存されない場合の条件式が合ってないのではと考えてます。
関連する箇所を思いつく限り弄ってみましたが変化なしです。
indexアクションの

@rooms = Room.all.includes(:user) @messages = @room.messages.includes(:user)

の、includesでダブってるからまずいのかなと考えましたが、@roomsの箇所を消すとサイドバーのルーム名が表示されずエラーとなります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

create内で@roomsへの代入がないため、createで失敗して再表示を行う際には@roomsnilとなってしまいます。

投稿2021/02/08 13:00

maisumakun

総合スコア145975

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

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

sasa_nagare

2021/02/08 13:07

解決しました!ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問