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

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

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

SlimはPHPアプリケーションを開発するための軽量なマイクロフレームワークです。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

72閲覧

【Rails】詳細画面でタグを表示させたい

nanananan

総合スコア7

Slim

SlimはPHPアプリケーションを開発するための軽量なマイクロフレームワークです。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2024/03/19 22:26

実現したいこと

お世話になっております。

ポートフォリオとして育児記録アプリを制作中に、日記投稿にタグ付け機能を追加したいと考えました。
しかしeachメソッドに文字列オブジェクトが渡ってしまい、eachメソッドが正常に機能していません。
タグ付け機能については下記サイト様を参考にしています。

https://zenn.dev/redheadchloe/articles/5eba56d25a7979
https://zenn.dev/goldsaya/articles/625bdf837c1c68

日記の詳細画面にタグを表示できるように実装中でしたが、表題のエラーが解決できず悩んでいます。

補足として、今回実装している日記はchildモデルと紐づいており、childモデルとdiaryモデルは1:Nの関係です。
また日記のタグ付けには中間テーブルを利用しています。

発生している問題・分からないこと

日記を投稿する際にタグ付けもできるよう実装したいのですが、詳細表示画面に遷移できずエラーメッセージが表示されてしまいます。

エラーメッセージ

error

1ActionView::Template::Error (undefined method `each' for "tag":String): 2 1: - tag_list.each do |list| 3 2: span.badge.rounded-pill.text-bg-dark 4 3: = link_to list.name, search_tag_path(diary_tag_id: list.id) 5 4: = "(#{list.diaries.count})" 6 7app/views/diaries/_tag.html.slim:1 8app/views/diaries/show.html.slim:25

該当のソースコード

diaries_controller_rb

1def show 2 @child = Child.find(params[:child_id]) 3 @diary = Diary.find(params[:id]) 4 @tag_list = @diary.diary_tags.pluck(:name).join(",") 5 @diary_tags = @diary.diary_tags 6 end

diaries/show.html.slim

1h2 = t".title" 2 3.mb-3 4table.table.table-hover 5 thead.thead-default 6 tr 7 th = Diary.human_attribute_name(:title) 8 th = Diary.human_attribute_name(:content) 9 th = Diary.human_attribute_name(:photo) 10 th = "タグ" 11 th = t"dictionary.items.edit" 12 th = t"dictionary.items.destroy" 13 tbody 14 tr 15 td = @diary.title 16 td = @diary.content 17 - if @diary.photo.present? 18 td = image_tag @diary.photo.url 19 - else 20 td = "no image" 21 - if @diary_tags.present? 22 .mb-3 23 td = render "diaries/tag", tag_list: @tag_list 24 - else 25 td = "no tag" 26 td = link_to t("diaries.links.to_edit_diary"), edit_child_diary_path(id: @diary.id), data: { turbo_method: :get } 27 td = link_to t("diaries.links.destroy_diary"), child_diary_path, data: { turbo_method: :delete, turbo_confirm: "削除してよろしいですか?" }, class: "btn btn-danger"

diaries/_tag.html.slim

1- tag_list.each do |list| 2 span.badge.rounded-pill.text-bg-dark 3 = link_to list.name, search_tag_path(diary_tag_id: list.id) 4 = "(#{list.diaries.count})"

models/diary.rb

1class Diary < ApplicationRecord 2 3belongs_to :child 4 5has_many :diary_tag_relations, dependent: :destroy 6has_many :diary_tags, through: :diary_tag_relations 7 8accepts_nested_attributes_for :diary_tag_relations, allow_destroy: true 9 10def save_diary_tags(tags) 11 current_tags = self.diary_tags.pluck(:name) unless self.diary_tags.nil? 12 old_tags = current_tags - tags 13 new_tags = tags - current_tags 14 15 old_tags.each do |old_name| 16 self.diary_tags.delete DiaryTag.find_by(name: old_name) 17 end 18 19 new_tags.each do |new_name| 20 diary_tag = DiaryTag.find_or_create_by(name: new_name) 21 self.diary_tags << diary_tag 22 end 23end

models/diary_tag.rb

1class DiaryTag < ApplicationRecord 2 3 has_many :diary_tag_relations, dependent: :destroy 4 has_many :diaries, through: :diary_tag_relations, dependent: :destroy 5 6 before_validation :downcase_name 7 8 validates :name, presence: true,uniqueness: { case_sensitive: false }, length: { maximum:50 } 9 10 private 11 12 def downcase_name 13 self.name = name.downcase if name.present? 14 end 15end

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

下記サイト様を参考に、eachメソッドに渡すデータを文字列オブジェクトから配列にしようとrender部分に"tag_list: @tag_list"を追加しました。

https://qiita.com/tanaka7014/items/f1c4b6505a2c672ea1f7

しかしエラー内容は変化せず、依然文字列オブジェクトが渡ったままです。
変数の渡し方がおかしいことは理解していますが、show部分のコントローラの設定自体がそもそもおかしいのでしょうか。

どのようにすればタグ付けした日記の詳細画面を表示できるようになるのか、お知恵を拝借できないでしょうか。
お手数おかけしますが、ご指導よろしくお願いします。

補足

・Rails 7.0.8.1
・slim
・macOS Moterey バージョン12.6.4

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

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

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

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

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

guest

回答1

0

自己解決

自己解決できました。

コントローラで設定しているインスタンス、ビューで渡しているインスタンスなどを再度確認して修正していくと表示できるようになりました。

投稿2024/03/23 23:36

nanananan

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問