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

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

 Foo is not a new record or nil  

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

有任何想法吗?

怎么样:

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

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

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

您可能也对这些感兴趣:

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

要么

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

让我为了好玩再举一个答案。

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

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

简单的方法是

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

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

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

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

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