RailsでデータがあるはずかNilになってしまう
- 評価
- クリップ 0
- VIEW 402

退会済みユーザー
Controlに下記のようなコードを記入したのですがlocalhost:3000/chatにアクセスしても NoMethodError in ChatController#index
undefined method `id' for nil:NilClass と出てしまいます。
他のページでは正常に表示されるのですがなぜかindexでは正常に表示されません。
確認したところちゃんとログインも出来た状態でした。
chat_controller.rb
class ChatController < ApplicationController
def create
current_user_chat_rooms = ChatRoomUser.where(user_id: current_user.id).map(&:chat_room)
chat_room = ChatRoomUser.where(chat_room: current_user_chat_rooms, user_id: params[:user_id]).map(&:chat_room).first
if chat_room.blank?
chat_room = ChatRoom.create
ChatRoomUser.create(chat_room: chat_room, user_id: current_user.id)
ChatRoomUser.create(chat_room: chat_room, user_id: params[:user_id])
end
redirect_to action: :show, id: chat_room.id
end
def index
@current_user = User.find_by(user_id: params[:user_id])
@chat_rooms = ChatRoom.joins(:chat_room_users).
where("chat_room_users.user_id =?", @current_user.id)
end
def show
chat_room = ChatRoom.find_by(id: params[:id])
@current_user = User.find_by(id: session[:user_id])
@chat_room_user = chat_room.chat_room_users.
where.not(user_id: current_user.id).first.user
@chat_room_myuser = chat_room.chat_room_users.
where.not(user_id: current_user.id).last.user
@chat_rooms = ChatRoom.joins(:chat_room_users).
where("chat_room_users.user_id =?", @current_user.id)
@chat_messages = ChatMessage.where(chat_room: chat_room).order(:created_at)
end
end
chat_room.rb
class ChatRoom < ApplicationRecord
has_many :chat_messages
has_many :chat_room_users
end
chat_room_user.rb
class ChatRoomUser < ApplicationRecord
belongs_to :chat_room
belongs_to :user
end
index.html.erb
<% @chat_rooms.each do |e| %>
<%= e.id %>
<% end %>
show.html.erb
<% provide(:title, @chat_room_user.username ) %>
<div class="container center">
<div class="sidebar">
<%= link_to root_path(), method: :get do%>
<div class="home-btn">
<%= image_tag 'right-nav/home', class: 'home-img' %>
<span class="home-p">ホーム</span>
</div>
<% end %>
<%= link_to home_path(), method: :get do%>
<div class="global-btn">
<%= image_tag 'right-nav/global', class: 'global-img'%>
<span class="global-p">グローバル</span>
</div>
<% end %>
<% if current_user.try(:admin?) %>
<%= link_to rails_admin_path(), method: :get do%>
<div class="control-btn">
<%= image_tag 'right-nav/control.svg', class: 'control-img'%>
<span class="control-p">管理画面</span>
</div>
<% end %>
<% end %>
<div class="group-btn">
<%= image_tag 'right-nav/group', class: 'group-img'%>
<span class="group-p">グループ</span>
</div>
</div>
<div class="main">
<% if @chat_room_myuser.id == @chat_room_user.id %>
<header class="header">
<div class="chatPartner">
<img src="<%= @chat_room_user.image %>" class="dm-icon">
<div class="dm-username"><%= @chat_room_user.username %></div>
<div class="dm-userid">@<%= @chat_room_user.user_id %></div>
</div>
</header>
<div class="chat-history">
<%= render @chat_messages %>
<% @chat_rooms.each do |e| %>
<%= e.id %>
<% end %>
</div>
<div class="text-box">
<form class="messageInputForm">
<div class="container">
<input type="text" data-behavior="room_speaker" class="messageInputForm_input" placeholder="メッセージを入力...">
</div>
</form>
</div>
</div>
</div>
<% else %>
<div class="error-message">
<p class="sorry-chat">Sorry</p>
<p class="sorry-text">ページを表示する権限がありません</p>
</div>
<% end %>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
@current_user = User.find_by(user_id: params[:user_id])
ではなく、
@current_user = User.find_by(id: params[:user_id])
ではないでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.37%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
退会済みユーザー
2020/01/03 23:42 編集
そのコードとエラーからわかるのは
@current_user = User.find_by(id: session[:user_id])
が nil ということだけです
レコードがないのか session にキーがないのかはわかりません
回答にいきつきたければ関連するコード(コントローラ全体と関連するモデル、必要によってはデータベーススキーマ)を追記してください
> 確認したところちゃんとログインも出来た状態
ログインを実現しているロジックも不明です
何をもって確認できたのかこちらには分かりません
退会済みユーザー
2020/01/04 00:11 編集
さっきと index 内のコードかわってないですか?
index も
@current_user = User.find_by(user_id: params[:user_id])
ではなく
@current_user = User.find_by(id: session[:user_id])
にすればいいのでは?
それでなおらないなら
index に遷移するときのビューや route をみないと正確にはわからないですが
普通 index には user_id ってパラメータは飛んでこないと思います
あと session も自前で管理してるんだとおもうんですが
session に値を入れるところも追記してくれないとこれ以上は分かりません