ビューでputsを使用しないでください。putsを使用すると、テキストがコンソールに送られます。これで修正されます:
<% if @tags.present? %>
<%= "Tags:"%>
<% end %>
また、.presentを使用する必要はありませんか?それの音によって。設定されているかどうかだけを確認したい場合は、.nilを使用する必要がありますか?代わりは。これを1行に要約することもできます。
<%= "Tags:" unless @tags.nil? %>
更新:getterとsetterの両方でtag_tokensメソッドが壊れているようです。セッターは実際には見た目では何も保存していません(.buildは新しいオブジェクトを返します。保存する必要があります)。ゲッターは、見た目で保存しようとしているarticle_tagsではなく、タグも参照しています。これに変更すると、保存に役立つはずです。
self.article_tags.build(:tag => Tag.find_or_create_by_name(string.strip.downcase)).save
これは、次のような行があることを前提としています。
has_many :article_tags
has_many :tags, through: :article_tags
私はあなたがあなたのセッターに基づいて行うと仮定しています。
これは多対多の関係だと思いますが、has_and_belongs_to_manyではなくhas_many:throughを使用しているようです。これには理由がありますか?has_and_belongs_to_manyを使用している場合は、次のことができるはずです。
has_and_belongs_to_many :tags
def tag_tokens=(tags_delimited)
self.tags = []
tags_delimited.split(",").each do |string|
self.tags << Tag.find_or_create_by_name(name: string)
end
end
その場合、ArticleTagsモデルはまったく存在しないはずであり、プライマリ列がなく、article_id列とtag_id列がないarticles_tagsというテーブルが必要です。
アップデート2:
@tagsを何にも設定していないため、常にnilになっています。@tagsは変数であり、コントローラーのindexメソッドで@articlesが設定されているのと同じように、値を持つように設定する必要があります。とにかく、これはインデックスメソッド用であるため、単一のインスタンス変数にする必要はありません。その特定のインスタンスのtag_tokensメソッドにアクセスする必要があります。app / views / articles / index.html.erbの53〜55行目を次のように変更する必要があります。
<%= "Tags:" if article.tags.any? %>