実現したいこと
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
提供コード等に不足ありましたらご指摘いただけると幸いです。
よろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー