0

我试图让文本“标签:”仅在标签存在时才显示,所以我在视图中执行了以下操作:

<% 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 %>只是导致“标签:”出现在每个帖子上。

4

3 回答 3

4

您不要在视图中使用 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? %>
于 2012-08-12T00:02:17.407 回答
1

通过 sgrif 检查答案,它包含很多优点。仅回答您的主要问题:

在 erb(Rails 中用于视图模板的“语言”)中,您可以使用<%= ... %>将一些 Ruby 代码的结果插入到视图模板中。

当你在做:

<%= puts "Tags:" %>

发生以下情况:

  1. Ruby 评估/执行您的代码:“标签:”打印到 STDOUT 并nil返回,因为对 alsways 的调用puts返回nil
  2. erb 将结果插入到您的模板中,结果为nil,显示为“无”

要修复它,只需使用:

<% if @tags.present? %>  
  <%= "Tags:"%> 
<% end %>

或者,因为你没有在 Ruby 中做任何事情,你可以使用:

<% if @tags.present? %>  
  Tags: 
<% end %>
于 2012-08-12T10:20:38.043 回答
0

@tags 被定义为什么?你想在哪里检查它是否存在?

你想要if @tags.nil?

于 2012-08-11T23:48:59.237 回答