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

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

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

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails 6

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

607閲覧

【Ruby On Rails】配列の中で複数モデルのインスタンスを取得する方法について

sato_sato

総合スコア8

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails 6

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2023/03/15 15:24

編集2023/03/16 21:20

実現したいこと

each文の中で複数モデルのインスタンスを取得させたいです。
最終的には、投稿一覧ページ(books/index)から、投稿詳細ページ(book/show)とユーザー詳細ページ(users/show)に遷移できるようにさせたいです。

前提

Railsで本の紹介サイトを作成しております。
本の投稿一覧ページ(book/index)を下記画像のように作成中です。
画像左の「NO IMAGE(画像)」をクリックすると、投稿したユーザーの詳細ページ(user/show)へ、
Title列のリンクをクリックすると、本の投稿詳細ページ(books/show)へ遷移できるように作成しようとしています。

イメージ説明

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

viewページ(books/index)で記述したeachメソッドの中にUserモデルとBookモデルの2つを入れる必要があると考え、books_controller.rb、books/index.htmlを修正しましたがName error, No method errorが出てしまい、記述方法がわからない状況です。

イメージ説明

該当のソースコード

controllers/books_controller.rb

1 def index 2 @user = current_user 3 @users = User.all 4 @book = Book.new 5 @books = Book.all 6 end 7 8 def show 9 @user = current_user 10 @book = Book.find(params[:id]) 11 end

views/books/index.html.erb

1<% @books.each do |books| %> 2 <% @users.each do |users| %> 3 <tr> 4 <td> 5 <%= link_to user_path(user.id) do %> 6 <%= image_tag book.user.get_profile_image(100,100) %> 7 <% end %> 8 </td> 9 <td><%= link_to book.title, book_path(book.id) %></td> 10 <td><%= book.body %></td> 11 </tr> 12 <% end %> 13<% end %>

rails␣routes(Terminal)

1books GET /books(.:format)      books#index 2book GET /books/:id(.:format) books#show 3user GET /users/:id(.:format) users#show

models/user.rb

1 devise :database_authenticatable, :registerable, 2 :recoverable, :rememberable, :validatable 3 4 has_many :books, dependent: :destroy 5 has_one_attached :profile_image 6 7 validates :name, presence: true, uniqueness: true, length: { in: 2..20 } 8 validates :introduction, length: { maximum: 50 } 9 10 def get_profile_image(width, height) 11 unless profile_image.attached? 12 file_path = Rails.root.join('app/assets/images/no_image.jpg') 13 profile_image.attach(io: File.open(file_path), filename: 'default-image.jpg', content_type: 'image/jpeg') 14 end 15 profile_image.variant(resize_to_limit: [width, height]).processed 16 end

models/book.rb

1 belongs_to :user 2 has_one_attached :image 3 4 validates :title, presence: true 5 validates :body, presence: true, length: { maximum: 200 }

試したこと

①番号リスト複数インスタンスを1つの配列に加えるように記述してみました

controllers/books_controller.rb

1 def index 2 @user = current_user 3 @users = User.all 4 @book = Book.new 5 @books = Book.all 6 # 複数モデルのインスタンスを1つの配列へ 7 @instances = @users | @books 8 end

views/books/index.html.erb

1<% @instances.each do |instance| %> 2 <tr> 3 <td> 4 <%= link_to user_path(user.id) do %> 5 <%= image_tag book.user.get_profile_image(100,100) %> 6 <% end %> 7 </td> 8 <td><%= link_to book.title, book_path(book.id) %></td> 9 <td><%= book.body %></td> 10 </tr> 11<% end %>


エラーメッセージ
undefined local variable or method `user' for #ActionView::Base:  
Did you mean?
@user
@users


②|books|、|users| → |book|、|user|へ変更

エラーは解消されましたが、下記の画像のように2回投稿されたことになっている(1つ削除すると2段分削除されたため、1投稿としてカウントされている)
イメージ説明


③eachメソッド | user |を削除

views/books/index.html.erb

1<% @books.each do |books| %> 2 <tr> 3 <td> 4 <%= link_to user_path(user.id) do %> 5 <%= image_tag book.user.get_profile_image(100,100) %> 6 <% end %> 7 </td> 8 <td><%= link_to book.title, book_path(book.id) %></td> 9 <td><%= book.body %></td> 10 </tr> 11<% end %>

  ↓
<%= link_to user_path(user.id) do %>にName error



提供コード等に不足ありましたらご指摘いただけると幸いです。
よろしくお願いいたします。

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

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

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

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

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

yuma.inaura

2023/03/15 15:29

|books| ここの命名の間違いでは
sato_sato

2023/03/15 15:43

コメント頂きありがとうございます。 |books| → |book| |users| → |user| 上記のとおりに修正したら解決しました。 大変ありがとうございます。
sato_sato

2023/03/15 16:39

先程はご回答いただき大変ありがとうございました。 「試したこと」②に追記しましたが、投稿一覧ページ(book/index)を見直したところ、投稿の表示が2段分表示されておりました。 eachメソッド内に複数モデルのインスタンスを追加する又は、削る部分が必要と考えましたが対処方法が思いつかない状況です。。
maisumakun

2023/03/15 23:13

モデル定義はどのようになっていますでしょうか?
sato_sato

2023/03/16 10:58

ご返信が遅くなりました。 user, bookモデルを追記いたしました。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

bookに紐づいたuserを参照したいだけなら、userのループは不要です。book.userで参照してください。

投稿2023/03/16 11:42

maisumakun

総合スコア145121

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

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

sato_sato

2023/03/16 12:20

books/index内で@user.eachを削除 → (book.id)を(book.user)に変更することで解決しました。 book内のuser情報を呼び出すことが頭の中から消えていました。 大変ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問