如何检查Ruby中的视图中的对象是否为零?

时间:2010-02-27 04:26:14

标签: ruby-on-rails ruby

我想仅在设置了名为@foo的对象时显示一行文本。 在我看来,我正在尝试这样的事情:

<% if !@foo.new_record? || !@foo.nil? %>
    Foo is not a new record or nil
<% end %>

但这失败了,返回You have a nil object when you didn't expect it! 我很确定这是因为new_record?方法而发生的。 如何在不导致错误的情况下检查某些内容是否为新记录或为零? 在PHP中,可以通过询问if(!empty($foo))来实现,但即使rails中的empty?方法也会导致返回相同的错误。

有什么想法吗?

7 个答案:

答案 0 :(得分:13)

怎么样:

<% if !@foo.nil? && !@foo.new_record? %>
  Hello!
<% end %>

首先,你需要在这里使用AND逻辑而不是OR逻辑,因为任何 ActiveRecord对象至少满足一个“not nil”或“not a new record”的要求。 / p>

其次,首先检查nil可确保在第一次检查失败时不运行第二次检查。抛出错误是因为您无法在不支持它的对象上使用#new_record?,因此首先检查nil可确保该方法永远不会运行为nil。

答案 1 :(得分:3)

你可能也对这些感兴趣:

<%= @foo.text if @foo.present? %>

<%= @foo.text unless @foo.blank? %>

答案 2 :(得分:2)

让我为了好玩而提出另一个答案。

unless @foo.nil? or @foo.new_record?
  "Hello"
end

答案 3 :(得分:1)

我会按if @foo && @foo.id查看。这将检查是否存在@foo activerecord对象,并确保id字段不为空。如果id字段为空,则表示它还不是数据库中的记录。我假设您在表中使用id字段。

答案 4 :(得分:1)

简单的方法是

<% if !@foo.try(:new_record) %>
  Hello!
<% end %>

答案 5 :(得分:1)

这个对象到达视图时可能是nil的原因吗?有时在视图中添加这样的条件逻辑可以表明某些事情可以被重构,而你只是掩盖了一个更大的问题。

答案 6 :(得分:0)

我更喜欢使用andand gem进行这些检查。

if @foo.andand.id
  "Hello!"
end

对.id的调用只能在非零对象上进行。