您不要在视图中使用 puts —— puts 会导致文本进入您的控制台。这将解决它:
<% if @tags.present? %>
<%= "Tags:"%>
<% end %>
您也不需要使用 .present?听它的声音。如果只想查看是否已设置,则应使用 .nil?反而。您也可以将其压缩为一行。
<%= "Tags:" unless @tags.nil? %>
更新:看起来 tag_tokens 方法在 getter 和 setter 中都被破坏了。从外观上看,您的 setter 实际上并没有保存任何东西(.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_many :through,而不是 has_and_belongs_to_many。是否有一个原因?如果你使用 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_tags 的表,以及一个 article_id 和 tag_id 列。
更新 2:
您没有将 @tags 设置为任何内容,这就是为什么它总是为零的原因。@tags 是一个变量,需要设置一个值,就像在控制器的 index 方法中设置 @articles 一样。无论如何,由于这是针对索引方法的,因此无论如何您都不希望它成为单个实例变量。您应该访问该特定实例的 tag_tokens 方法。app/views/articles/index.html.erb 第 53-55 行应更改为:
<%= "Tags:" if article.tags.any? %>