我想仅在设置了名为@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?
方法也会导致返回相同的错误。
有什么想法吗?
答案 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)