如何在Ruby on Rails 2中检查对象是否为空?

61

我想检查我的对象@objectname是否不等于null,如果是,则显示@objectname的值,否则显示未找到任何值。

我尝试了这个:

<% if (@objectname != null) then %>

但是我遇到了一个错误。

5个回答

76

2
建议使用 rails console 进行实时语句测试。 - Jonathan
如果@reviews.nil?,那么我会使用这个。即使有评论或没有评论,它始终为真。 - George Panayi
1
你的 if 语句中不应该有 then。你可能还想解释一下如何填充 @reviews(如果它始终为 .nil?),以便我们能够给出更多的建议。 - Pavel Veller
Pavel Veller,then是可选的,但我认为不应该完全不使用then。 - Marlin Pierce
@reviews 可能是一个数组,即使是空数组也是 true。尝试使用 empty?,或者如上所述,使用 present?blank? - DGM
George,打印评论(if之前)以验证它不是nil。 <%= @reviews.inspect %> - Marlin Pierce

45

你可以通过调用 present? or blank? 方法来检查一个对象是否为 nil(空)。

@object.present?

如果项目名为空字符串或nil,则此代码将返回false。

或者你可以使用

@object.blank?

这和使用`present?`方法是相同的,只不过在结果上加了一个感叹号。如果你不喜欢使用`unless`,你可以使用它。对于空字符串或nil值,它将返回true。


“#blank?”和“#present?”除了对象是否为“nil”之外,还有其他含义。而且,“then”在Ruby的if语句中虽然不常见,但也是可以使用的。 - Joshua Cheek
1
还应该注意到#present?#blank?仅在Rails中可用,而在普通的Ruby中不存在。 - user3096803

21

5
在你的例子中,你可以简单地用`nil`替换`null`,这样它就能正常工作了。
require 'erb'

template = <<EOS
<% if (@objectname != nil) then %>
  @objectname is not nil
<% else %>
  @objectname is nil
<% end %>
EOS

@objectname = nil
ERB.new(template, nil, '>').result # => "  @objectname is nil\n"

@objectname = 'some name'
ERB.new(template, nil, '>').result # => "  @objectname is not nil\n"

与另一位发帖者的说法相反,您可以看到上面的代码在Ruby中很好地运行。虽然不常见,但也没问题。

#blank?#present?有其他含义。具体而言,如果对象响应#empty?,它们将检查它是否为空。如果您转到http://api.rubyonrails.org/并搜索“blank?”,您将看到其定义的对象以及它的工作原理。查看Object上的定义,我们可以看到:"如果一个对象是false、空或空格字符串,则该对象为空。例如,“”、“ ”,nil,[]和{}都是空白的。"您应该确保这就是您想要的。

此外,nil被认为是false,而除了false和nil以外的任何内容都被认为是true。这意味着您可以直接将对象放置在if语句中,因此编写以上内容的更标准的方法是:

require 'erb'

template = <<EOS
<% if @objectname %>
  @objectname is not nil
<% else %>
  @objectname is nil
<% end %>
EOS

@objectname = nil
ERB.new(template, nil, '>').result # => "  @objectname is nil\n"

@objectname = 'some name'
ERB.new(template, nil, '>').result # => "  @objectname is not nil\n"

如果您明确需要检查 nil 而不是 false ,则可以使用#nil?方法,其中 nil 是唯一会导致此返回值为true的对象。
nil.nil?          # => true
false.nil?        # => false
Object.new.nil?   # => false

4
你可以使用简单的 not 标志来验证它。 例如:
if !@objectname

如果@objectname为nil,这将返回true。不应使用点操作符或空值,否则会抛出异常。

*** NoMethodError Exception: undefined method `isNil?' for nil:NilClass

一个理想的空值检查应该是这样的:

!@objectname || @objectname.nil? || @objectname.empty?

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