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

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

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

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

Q&A

1回答

1529閲覧

【Rails】acts_as_taggableを用いたタグ/show.html.erbの作成

yuta_tokyo

総合スコア35

Ruby on Rails

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

0グッド

0クリップ

投稿2017/03/04 07:32

編集2017/03/10 05:50

はじめまして、プログラムを勉強しはじめて2ヶ月半が経とうとしている学生です。

以前以下の質問でacts_as_taggableを用いたタグ機能の実装について質問しました(moke様ご回答ありがとうございます!)
https://teratail.com/questions/67602

現在掲示板を作成しております。そこでtag機能を実装しているのですが、tags/show.html.erbでうまく関連するpostを紐づけることができません。

実装したい内容は該当tagを有するpostをtags/show.html.erbにてpostへのリンクとともにリストアップすることです。

何かしらの解決方法がありましたらご教授をいただきたいです!

posts/show.html.erb

<strong>タグ:</strong> <% @post.save_tags %> <%= @post.tag_list.map{|tag|link_to(tag,"/tags/#{tag}")}.join(",").html_safe %>

tags_controller.rb

class TagsController < ApplicationController def show @tag=ActsAsTaggableOn::Tag.find_by(name: params[:name]) @posts = Post.tagged_with(@tag.name) end end

routes.rb

#該当部分のみ resources :posts do resources :comments resources :tags end get 'tags/:name' => 'tags#show' resources :tags, only: [:index, :show]

#追記
post.rb

def save_tags array = self.check_taggable_word(self.title) self.tag_list.add(array, parse: true) #self.save end def tag_lists tag_lists = self.tag_list end def check_taggable_word(text) ary = Array.new nm = Natto::MeCab.new nm.parse(text) do |n| ary<<n.surface end #mekabuで要素に分解 tags = ActsAsTaggableOn::Tag.pluck(:name) #タグを取得 return ary & tags #共通部分を返す end

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

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

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

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

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

guest

回答1

0

tag_list.add()した後にmodelをsaveして初めて
tagが追加されるようです。
その周りを修正すれば治ります。

ruby

1@post.tag_list.add('tag') 2@post.save

投稿2017/03/04 08:40

moke

総合スコア2241

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

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

yuta_tokyo

2017/03/10 05:55

質問に現在のpost.rbを追記しました。self.saveを実行すると ・ ・ ・ CACHE (0.0ms) SELECT "tags"."name" FROM "tags" ["タグ1", "タグ2"] CACHE (0.0ms) SELECT "tags"."name" FROM "tags" ["タグ1", "タグ2"] CACHE (0.0ms) SELECT "tags"."name" FROM "tags" ["タグ1", "タグ2"] ["タグ1", "タグ2"] CACHE (0.0ms) SELECT "tags"."name" FROM "tags" ["タグ1", "タグ2"] CACHE (0.0ms) SELECT "tags"."name" FROM "tags" ["タグ1", "タグ2"] (0.1ms) rollback transaction Completed 500 Internal Server Error in 2284ms (ActiveRecord: 10.1ms) SystemStackError (stack level too deep): app/models/post.rb:27:in `save_tags' app/models/post.rb:27:in `save_tags' app/models/post.rb:27:in `save_tags' app/models/post.rb:27:in `save_tags' app/models/post.rb:27:in `save_tags' app/models/post.rb:27:in `save_tags' ・ ・ ・ とエンドレスで実行され保存が企画、ページが固まってしまいます。
moke

2017/03/10 07:19 編集

まあ、当然ですよね、私が書いたコードでしたっけ。 post側に書いてしまったのですね。 post をsave中にpostをsaveするという指示を与えたらそりゃあそうなる post.rb の上の方も晒してください 実はそこが重要です。 1ヶ月以上前なので忘れてましたが afre_save :save_tags になっていたら before_save :save_tags に変えてください。 self.saveは消したままです。 after_saveだとpostはすでにsaveされてしまっているので それにいくらタグをつけてもタグはsaveされません before_saveならおっけー。
yuta_tokyo

2017/03/10 08:58

post.rbの上の方は以下のようになっております。 acts_as_taggable_on :tags acts_as_taggable before_save :save_tags
yuta_tokyo

2017/03/10 09:00

最終的にはtagsの各tag show.html.erbに、そのtagがついているpost show.html.erbへのテキストリンクを持って行きたいんです
moke

2017/03/10 09:36

before_save :save_tags を after_validation :save_tags に変えてみて状況が改善されなかったらまた報告ください
yuta_tokyo

2017/03/11 02:56

after_validation :save_tagsでpostのsaveと表示はしっかり起動しました! tags show.html.erbで該当する各リンクを表示するのはどうしたらよいのでしょうか? postリンクのtags show.html.erbへの呼び出しがうまくいきません...
moke

2017/03/11 03:07

どう考えて、どう工夫してみて、結果を具体的に(エラーが出るならエラーコード、思い通りの結果が出ないなら、理想と現実)書いて初めて回答がもらえると思います。 とりあえず、この質問内容から回答できるのはここまでです。 上記を意識して質問を立て直してみては?
yuta_tokyo

2017/03/12 10:23 編集

お忙しい中申し訳ありませんが何卒よろしくお願いします!!!
yuta_tokyo

2017/03/12 16:39

moke様 tags/show.html.erbに紐づけられているpost/show.html.erbへのテキストリンクを貼る件ですが、おそらくpost.rbにてself.saveを一度行わないといけないと思うのですがいかがでしょうか? 現状だと@tagとコンソールで叩くと ”=> #<ActsAsTaggableOn::Tag id: 1, name: "TAG-1", taggings_count: 0>”とtagging_countが0になっている状態でございます。self.saveする方法をご教授いただけないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問