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

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

新規登録して質問してみよう
ただいま回答率
85.35%
タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

Ruby on Rails

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

1回答

1087閲覧

タグ機能実装 検索後、タグに紐づけした投稿を一覧表示できない rubyonrails

rirugameri

総合スコア0

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

Ruby on Rails

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

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

0クリップ

投稿2021/08/07 02:57

編集2021/08/07 03:02

前提・実現したいこと

初質問なのでつたないところがありましたら、すみません。
Rubyonrailsで、おすすめの本を投稿するサイトを作っています。
本の投稿にタグを付けられる機能を実装しようと考えています。
タグの保存まではできました。
タグを検索した後、検索結果を表示しようとしたところエラーメッセージがでました。

なぜ、<% @tags.books.each do |tag| %>で紐づけしている投稿が表示できないのか、ご指導よろしくお願いします。

ruby '2.6.3'

gem 'rails', '~> 5.2.5'

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

NoMethodError in Searchs#search Showing /home/ec2-user/environment/bookers8d/app/views/searchs/search.html.erb where line #23 raised: undefined method `books' for #<Tag::ActiveRecord_Relation:0x00007f6f012be0b8> Extracted source (around line #23): </thead> <tbody> <% @tags.books.each do |tag| %> #エラーが出ている部分 <tr> <td> </td>

該当のソースコード

Rails.application.routes.draw do devise_for :users # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html get 'search' => 'searchs#search' end
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? old_tags = current_tags - sent_tags 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 end
class Tag < ApplicationRecord has_many :tag_maps, dependent: :destroy, foreign_key: 'tag_id' has_many :books, through: :tag_maps def self.search(keyword) @tags = Tag.where("tag_name LIKE?","%#{keyword}%") end end
class TagMap < ApplicationRecord belongs_to :book belongs_to :tag validates :book_id,presence:true validates :tag_id,presence:true end
class BooksController < ApplicationController before_action :authenticate_user! before_action :ensure_correct_user, only: [:edit, :update, :destroy] def index if params[:button].to_i == 1 @books = Book.all.order(id: "ASC") elsif params[:button].to_i == 2 @books = Book.all.order(rate: "DESC") else @books = Book.all end @book = Book.new end def create @book = Book.new(book_params) tag_list = params[:book][:tag_name].split(nil) @book.user_id = current_user.id if @book.save @book.save_tag(tag_list) redirect_to book_path(@book), notice: "You have created book successfully." else @books = Book.all render 'index' end end private def book_params params.require(:book).permit(:title, :body, :rate) end def ensure_correct_user @book = Book.find(params[:id]) unless @book.user == current_user end end end
class SearchsController < ApplicationController def search keyword = params[:keyword] @tags = Tag.search(keyword) @book = Book.new end end
<li> <%= form_with(url: search_path, local: true, method: :get) do |form| %> <%= form.text_field :keyword %> <%= form.submit "検索", class: "btn btn-primary" %> <% end %> </li>
<div class='container px-5 px-sm-0'> <%= render 'layouts/errors', obj: @book %> <div class='row'> <div class='col-md-3'> <h2>User info</h2> <%= render 'users/info', user: current_user %> <h2 class="mt-3">New book</h2> <%= render 'books/form', book: @book %> </div> <div class='col-md-8 offset-md-1'> <h2>Books</h2> <table class='table table-hover table-inverse'> <thead> <tr> <th></th> <th>Title</th> <th>Opinion</th> <th>Category</th> <th colspan="2"></th> </tr> </thead> <tbody> <% @tags.books.each do |tag| %> #エラー該当 <tr> <td> </td> <td></td> <td></td> <td></td> </tr> <% end %> </tbody> </table> </div> </div> </div>

試したこと

他の質問の回答を見て、<%= tag.books.map(&:title).join(', ') %>を試したところ、titleは表示ができました。表示できた理由は理解していません。
投稿した本人のimageを表示したいとき、
<%= attachment_image_tag(@tags.book.map(&:user), :profile_image, :fill, 50, 50, fallback: "no-image-icon.jpg") %>で表示できませんでした。

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

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

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

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

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

guest

回答1

0

<% @tags.books.each do |tag| %> には2つ問題があります。

  1. books は Tag のmethodです。@tags は Tag ではなく Tagの集合体です。これには booksはありません。
  2. do |tag| ならば、@tags.each です。

このeachは何を一覧したいのですか?

投稿2021/08/09 03:19

winterboum

総合スコア23567

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問