前提・実現したいこと
特定のユーザーが作成したチャットルームに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
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の箇所を消すとサイドバーのルーム名が表示されずエラーとなります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/08 13:07