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

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

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

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

Ruby on Rails

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

Q&A

解決済

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

t-b-nk
t-b-nk

総合スコア4

Ruby

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

Ruby on Rails

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

1回答

0グッド

0クリップ

186閲覧

投稿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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

t-b-nk

2022/11/04 04:42

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

回答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

総合スコア22593

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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カラムを追加しました なんとか解決出来るように頑張ります!

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby

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

Ruby on Rails

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