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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

516閲覧

中間テーブルから値を取得して値を結合させたい

t-b-nk

総合スコア4

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2022/11/03 09:53

実現したいこと

・中間テーブルの結合
・viewにユーザー情報の表示

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

NoMethodError in ChatRooms#show
https://i.gyazo.com/c7915d4db7313dc860a3669a114a6f47.png

該当のソースコード

app/views/chat_rooms/show.html.erb

<%= render "shared/second-header"%> <div class="container"> <div class="room-main"> <div class="heading-area"> <div class="heading"> <%= @chat_room.name %> </div> </div> <div class="user-image-area"> 投稿者:<%= link_to @chat_room.user.nickname, user_path(@user) %> <% if @chat_room.image.present?%> <div class="image-display"> <div class="image-outer"> <div class="image-item"> <%= @chat_room.image %> </div> </div> </div> <% else %> <div class="image-display"> <div class="image-outer"> <p class="image-item">no<br>image<p> </div> </div> <% end %> </div> <p class="profile-text">ルーム紹介</p> <div class="profile-area"> <div class="profile"> <%= @chat_room.introduction %> </div> </div> <div class="participate-area"> <p class="participate-btn">参加する</p> </div> </div> </div>

app/controllers/chat_rooms_controller.

class ChatRoomsController < ApplicationController def index @genres = Genre.where(:id => 2..8) end def new @chat_room_category = ChatRoomCategory.new end def create @chat_room_category = ChatRoomCategory.new(chat_room_category_params) if @chat_room_category.valid? @chat_room_category.save redirect_to root_path else render :new end end def show @chat_room = ChatRoom.find(params[:id]) @user = User.find(params[:id]) end private def chat_room_category_params params.require(:chat_room_category).permit(:name, :introduction, :genre_id, :image, :user_id).merge(user_id: current_user.id) end end

app/models/chat_room.rb

class ChatRoom < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :genre has_one_attached :image has_many :chat_room_users has_many :users, through: :chat_room_users belongs_to :category end

app/models/user.rb

class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable validates :nickname, presence: true PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze validates_format_of :password, with: PASSWORD_REGEX has_one_attached :image has_many :chat_room_users has_many :chat_rooms, through: :chat_room_users end

app/models/user.rb

class ChatRoomUser < ApplicationRecord belongs_to :chat_room belongs_to :user end

試したこと

エラーでNo methodが出てしまった原因としてchat_roomsテーブルにuser_idが無い為、nicknameカラムが参照出来ない為エラーが出てていると仮説を立てました。
user_idを中間テーブルから取得してインスタンスのchat_roomに代入出来ないか調べたところ、eager_loadメソッドが有効と分かりました。
解決の手順までは見えたのですが肝心の記述方法がいまいち分からず手詰まりになってしまいました。
どなたか解決方法をご教授いただけますでしょうか。

補足情報(FW/ツールのバージョンなど)

ryby
ruby on rails

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

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

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

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

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

t-b-nk

2022/11/04 04:42

回答ありがとうございます! エラー画面でusersではないか?と出てくるのはその為だったのですね 今回はchat_roomを作成したuserを取得したいので記述方法を探って試してみたいと思います。 こちらもおっしゃる通りです,,, user_path(@user) はparamsではなく特定のuserを取得出来るような記述を施してみます!
guest

回答1

0

ベストアンサー

has_many :users, through: :chat_room_users ですから roomには複数のUserが居ます。
それを
link_to @chat_room.user.nickname,
と、単数で見ているからです。
@chat_room.users のなかの特定のだれか、を表示するなら、それを選ぶ必要があります。
全員を表示するなら、 @chat_room.users をeachで回すことになります。

なお、それでも user_path(@user) が問題。

def show @chat_room = ChatRoom.find(params[:id]) @user = User.find(params[:id]) end

の params[:id] はChatRoom の id なのでは? それで Userを探しても 別人です。

投稿2022/11/03 23:24

winterboum

総合スコア23329

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

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

t-b-nk

2022/11/04 04:44

回答ありがとうございます! エラー画面でusersではないか?と出てくるのはその為だったのですね 今回はchat_roomを作成したuserを取得したいので記述方法を探って試してみたいと思います。 こちらもおっしゃる通りです,,, user_path(@user) はparamsではなく特定のuserを取得出来るような記述を施してみます!
winterboum

2022/11/04 05:11

chat_roomを作成したuser とすると その情報はmodelにありますかね、 owner とか createed_by とかで作成時の current_user をしまっておくような
t-b-nk

2022/11/04 05:22

無いです,,, すみません、知識が浅いので中間テーブルからチchat_room_idに紐付くusr_idを持って来れば大丈夫と思っていました
winterboum

2022/11/04 05:30

それは参加するどのuserにも flatですから、 あえていえば 中間テーブルのなかの一番古いもの、と言えなくもないですが
t-b-nk

2022/11/04 07:04

第一段階として別名外部キーとしてchat_rooms内にownerカラムを追加しました なんとか解決出来るように頑張ります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問