如果条件为真,则显示文本

时间:2012-08-11 23:41:46

标签: ruby-on-rails ruby if-statement

我正在尝试将文本“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 %>只会导致“标签:”显示在每个帖子上。

3 个答案:

答案 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:" %>

发生以下情况:

  1. Ruby评估/执行您的代码:“标签:”打印到STDOUT,并且因为nil的呼叫返回puts
  2. 而返回nil
  3. erb将结果插入到您的模板中,结果为nil,显示为“无”
  4. 要修复它,只需使用:

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

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

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

答案 2 :(得分:0)

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

您想要if @tags.nil?

吗?