実現したいこと
お世話になっております。
ポートフォリオとして育児記録アプリを制作中に、日記投稿にタグ付け機能を追加したいと考えました。
しかし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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。