前提・実現したいこと
本の投稿サイトを実装中です。複数タグをつけれるようにしました。
本の詳細ページでは、その投稿に紐付いてるタグを見れるようにしたのですが、
本の一覧ページでの表示がうまくできません。どう記述すれば、一覧ページで、投稿に紐づくタグを表示できるか教えていただきたいです。
該当のソースコード
books_controller.rb def index @book=Book.new books_order = Book.order('id DESC') @books=books_order.page(params[:page]) @tag_list=Tag.all end def show @books=Book.find(params[:id]) @book_tags = @books.tags end
詳細ページでは下記の通り記載することで、紐付いているタグを表示できました。
show.html.erb <% @book_tags.each do |tag| %> <%= link_to tag.tag_name, search_tag_path(tag_id: tag.id) %> <%="(#{tag.books.count})" %><% end %>
投稿一覧ページでも、紐付いているタグを表示したいのですが、
<%= book.tags.tag_name %>とやっても
undefined method `tag_name' for #Tag::ActiveRecord_Associations_CollectionProxy:0x00007f3cfc032088
となってしまいます。
index.html.erb <tr> <% @books.each do |book| %> <td><%= link_to user_path(book.user.id) do %> <%= attachment_image_tag book.user, :profile_image,format: 'jpeg',size: "40x40", fallback: "no_image.jpg" %> <% end %></td> <td><%= link_to book_path(book.id) do %><%= book.title %></td> <td><%= book.body %></td> <td><%= link_to book.category, search_book_path(keyword: book.category) </td>
TAGSテーブルのマイグレーションファイル class CreateTags < ActiveRecord::Migration[5.2] def change create_table :tags do |t| t.string :tag_name t.timestamps end end end 中間テーブルであるTAG MAPS class CreateTagMaps < ActiveRecord::Migration[5.2] def change create_table :tag_maps do |t| t.references :book, foreign_key: true t.references :tag, foreign_key: true t.timestamps end end end
アソシエーション等、モデルファイルの記述
BOOKモデル class Book < ApplicationRecord has_many :tag_maps,dependent: :destroy has_many:tags,through: :tag_maps def save_tag(sent_tags) # タグが存在していれば、タグの名前を配列として全て取得 current_tags = self.tags.pluck(:tag_name) unless self.tags.nil? # 現在取得したタグから送られてきたタグを除いておoldtagとする old_tags = current_tags - sent_tags # 送信されてきたタグから現在存在するタグを除いたタグをnewとする new_tags = sent_tags - current_tags # 古いタグを消す old_tags.each do |old| self.tags.delete Tag.find_by(tag_name: old) end # 新しいタグを保存 new_tags.each do |new| new_book_tag = Tag.find_or_create_by(tag_name: new) self.tags << new_book_tag end end TAGモデル class Tag < ApplicationRecord has_many :tag_maps, dependent: :destroy, foreign_key: 'tag_id' has_many :books, through: :tag_maps end TAG MAPモデル class TagMap < ApplicationRecord belongs_to :book belongs_to :tag validates :book_id, presence: true validates :tag_id, presence: true end
試したこと
index.html.erbで
<td><%= book.tags.tag_name %></td> <% book.tags.each do |tag| %><td><%= tag.tag_name %><% end %></td>も試しましたが、undefined method `tag_name'となってしまいます。 <td><%= book.tags.count %></td>で、タグの数は取り出せるので、なぜtag_nameがエラーになってしまうのか分かりません。補足情報(FW/ツールのバージョンなど)
以下の記事を参考に実装を行いました。
https://qiita.com/kurawo___D/items/e9a2dd0bf46cca706e5c
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/31 13:58
2021/08/01 01:30