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

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

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

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

Ruby

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

Ruby on Rails

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

Q&A

解決済

2回答

1073閲覧

投稿一覧で記事につけられてるタグを表示したいです。ruby on rails

kiiiiiii

総合スコア1

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/07/29 06:36

前提・実現したいこと

本の投稿サイトを実装中です。複数タグをつけれるようにしました。
本の詳細ページでは、その投稿に紐付いてるタグを見れるようにしたのですが、
本の一覧ページでの表示がうまくできません。どう記述すれば、一覧ページで、投稿に紐づくタグを表示できるか教えていただきたいです。

該当のソースコード

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

'book.tags.tag_name' → 'book.tags.map(&:tag_name).join(', ')'

投稿2021/07/31 10:13

winterboum

総合スコア23347

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

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

kiiiiiii

2021/07/31 13:58

できました!ありがとうございます。mapもjoinも理解できていないので、調べて理解するようにします!ありがとうございました。
winterboum

2021/08/01 01:30

つけなかったらどうなるか、をみるとよいですね
guest

0

アソシエーション・記述見る限り、特に怪しそうな点はないのですが、
controllerのindexで記述の最後にbinding.pryを追記して、@book.tagsの中身を確認してみてください。

投稿2021/07/31 05:37

J_O

総合スコア143

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問