我正在尝试将文本“Tags:”仅在标签出现时显示,所以我在视图中执行了以下操作:
<% if @tags.present? %>
<%= puts "Tags:"%>
<% end %>
哪个不起作用......我是初学者,不知道我做错了什么。
由于
编辑:
标签属于文章。
标签在我的文章模型中定义为:
def tag_tokens
self.tags.collect{|t| t.name}.join(", ")
end
def tag_tokens=(tags_delimited)
tags_delimited.split(",").each do |string|
self.article_tags.build(:tag => Tag.find_or_create_by_name(string.strip.downcase))
end
end
我正在尝试这样做,以便当文章有标签时,“标签:”一词出现在标签列表之前,当文章没有任何标签时,单词“标签:”不会出现。
现在<% if @tags.nil %>
只会导致“标签:”显示在每个帖子上。
答案 0 :(得分:4)
您不在视图中使用puts - puts会导致文本转到您的控制台。这将解决它:
<% if @tags.present? %>
<%= "Tags:"%>
<% end %>
您也不需要使用.present?听到它的声音。如果您只想查看它是否已设置,您应该使用.nil?代替。您也可以将其缩减为一行。
<%= "Tags:" unless @tags.nil? %>
更新:看起来在getter和setter中你的tag_tokens方法都被破坏了。你的setter实际上并没有通过它的外观保存任何东西(.build返回一个新对象,你需要保存它)。你的getter也引用了标签,而不是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模型,你应该有一个名为articles_tags的表,没有主列,还有一个article_id和tag_id列。
更新2:
你没有将@tags设置为任何东西,这就是为什么它始终为零。 @tags是一个变量,需要将其设置为具有一个值,就像在控制器的索引方法中设置@articles一样。无论如何,因为这是一个索引方法,所以你不希望它成为单个实例变量。您应该访问该特定实例的tag_tokens方法。 app / views / articles / index.html.erb第53-55行应更改为:
<%= "Tags:" if article.tags.any? %>
答案 1 :(得分:1)
通过sgrif检查答案,它包含很多好处。只回答你的主要问题:
在erb(Rails中用于视图模板的“语言”)中,您可以使用<%= ... %>
将一些Ruby代码的结果插入到视图模板中。
当你这样做时:
<%= puts "Tags:" %>
发生以下情况:
nil
的呼叫返回puts
nil
nil
,显示为“无”要修复它,只需使用:
<% if @tags.present? %>
<%= "Tags:"%>
<% end %>
或者,因为你没有在Ruby中做任何事情,你可以使用:
<% if @tags.present? %>
Tags:
<% end %>
答案 2 :(得分:0)
@tags被定义为什么?你想在哪里查看它是否存在?
您想要if @tags.nil?