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

12

我想要在仅当一个名为@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个回答

14

如何考虑:

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

首先,你需要使用AND逻辑而不是OR逻辑,因为任何 ActiveRecord 对象都至少符合“非空”或“非新记录”要求之一。

其次,首先检查是否为空确保在第一个检查失败时不运行第二个检查。如果尝试在不支持#new_record?方法的对象上运行该方法,则会抛出错误,因此首先检查是否为空可确保在nil上永远不会运行该方法。


1
你也可以使用德摩根定律稍微美化一下它:unless @foo.nil? || @foo.new_record?; puts 'Hello!'; end; - Jimmy
4
!foo.nil?让我感到非常困惑,因为它可以被简单地替换为foo。这是Ruby中一个非常简单和常见的习惯用语:if @foo && !@foo.new_record? - Alex Wayne

3

让我再来一个有趣的答案。

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

3
您可能也对以下内容感兴趣:
<%= @foo.text if @foo.present? %>

或者

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

这些方法没有检查 @foo 是否为空,但感谢额外的方法。 - Yuval Karmi

1
我会检查一下 if @foo && @foo.id。这将检查是否有一个 @foo activerecord 对象,并确保 id 字段不为空。如果 id 字段为空,则意味着它还不是数据库中的记录。我假设您正在使用表格中的 id 字段。

1

简单的方法是

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

1
这个对象到达视图时为什么可能是nil?有时在视图中添加这样的条件逻辑可能意味着需要重构一些代码,因为你只是掩盖了一个更大的问题。

0

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

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

对非 nil 对象才会调用 .id。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接