前提・実現したいこと
こちらの記事を参考に、RailsアプリにDM機能を実装しています。
RailsでややこしいDM機能を1万字でくわしく解説してみた
上記の記事では、トークルーム(rooms/show.html.erb
)に、
- ログイン中ユーザーのユーザー情報
- トーク相手のユーザー情報
を、それぞれ表示していますが、
「トーク相手のユーザー情報だけ」を表示するように変更したいです。
該当のソースコード
rooms_controller.rb
ruby
1 # GET /rooms/:id 2 def show 3 @room = Room.find(params[:id]) 4 if Entry.where(user_id: current_user.id,room_id: @room.id).present? 5 @messages = @room.messages 6 @message = Message.new 7 @entries = @room.entries 8 else 9 redirect_back(fallback_location: root_path) 10 end 11 end
rooms/show.html.erb
<% @entries.each do |e| %> <div class="user-name"> <strong> <%= image_tag e.user.avatar, class:"user-image" %> <a class="rooms-user-link" href="/users/<%= e.user.id %>"> <%= e.user.name %>さん </a> </strong> </div> <% end %>
試したこと
上記のeach
を用いたコードでは、entriesテーブルから取得したデータに対してusersテーブルのアソシエーションが機能しているので、
下記変更後のコードでも、entriesテーブルからwhereメソッドで条件を指定して取得してきたデータに対してuserのアソシエーションを用いてみると、機能しませんでした。
この違いはどこにあるのでしょうか?
> e = Entry.first Entry Load (0.4ms) SELECT "entries".* FROM "entries" ORDER BY "entries"."id" ASC LIMIT ? [["LIMIT", 1]] => #<Entry id: 1, user_id: 1, room_id: 1, created_at: "2021-11-10 03:32:52", updated_at: "2021-11-10 03:32:52"> > e.user User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] => #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2021-10-27 03:52:05", updated_at: "2021-10-27 03:52:05", password_digest: [FILTERED], remember_digest: nil, admin: true, activation_digest: "$2a$12$a5wBerQmUiR2bPbf8YZr.OgpSI8U/OSV9CuMUtkMipQ...", activated: true, activated_at: "2021-10-27 03:52:04", reset_digest: nil, reset_sent_at: nil> > ee = Entry.where(room_id: 1).where.not(user_id: 1) Entry Load (0.4ms) SELECT "entries".* FROM "entries" WHERE "entries"."room_id" = ? AND "entries"."user_id" != ? LIMIT ? [["room_id", 1], ["user_id", 1], ["LIMIT", 11]] => #<ActiveRecord::Relation [#<Entry id: 2, user_id: 4, room_id: 1, created_at: "2021-11-10 03:32:52", updated_at: "2021-11-10 03:32:52">]> > ee.user Traceback (most recent call last): 1: from (irb):55 Entry Load (0.3ms) SELECT "entries".* FROM "entries" WHERE "entries"."room_id" = ? AND "entries"."user_id" != ? LIMIT ? [["room_id", 1], ["user_id", 1], ["LIMIT", 11]] NoMethodError (undefined method `user' for #<Entry::ActiveRecord_Relation:0x00007fa0e4d473f8>)
####改変後のコード
rooms_controller.rb
ruby
1 # GET /rooms/:id 2 def show 3 @room = Room.find(params[:id]) 4 if Entry.where(user_id: current_user.id, room_id: @room.id).present? 5 @messages = @room.messages 6 @message = Message.new 7 # 以下2行を追加 8 @partner_entry = Entry.where(room_id: @room.id).where.not(user_id: current_user.id) 9 @user = @partner_entry.user 10 else 11 redirect_back(fallback_location: root_path) 12 end 13 end
rooms/show.html.erb
※ 画像の表示箇所はgravatorに変更しています。
erb
1<h4 class="rooms-title">ダイレクトメッセージを送る</h4> 2<div class="user-name"> 3 <strong> 4 <%= gravatar_for @user, class:"user-image" %> 5 <a class="rooms-user-link" href="/users/<%= @user.id %>"> 6 <%= @user.name %>さん 7 </a> 8 </strong> 9</div> 10 11<%# 以下略 %>
発生している問題・エラーメッセージ
NoMethodError in RoomsController#show undefined method `user' for #<Entry::ActiveRecord_Relation:0x00007fa367fd4348> Did you mean? super
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/12 02:50