ROR +错误nil.empty?在运行代码时

时间:2011-03-10 03:52:08

标签: ruby-on-rails ruby postgresql

我的“项目”表将发票作为整数属性,这里我将nil对象放在DB中的此属性中。在评估期间nil.empty?发生。 在HAML扩展中编写的代码

- @project.each do |proj|
  =proj.invoice if !proj.invoice.blank? || !proj.invoice.empty? || !proj.invoice.nil?
  - @project_invoice=proj.invoice

  =@project_invoice=0 if proj.invoice.blank? || proj.invoice.empty? || proj.invoice.nil

运行代码时收到此错误。

NoMethodError:当你没想到它时,你有一个零对象! 您可能期望一个Array实例。 在评估nil.empty?

时发生错误

4 个答案:

答案 0 :(得分:4)

Ruby和rails提供了一些标准测试可以提供帮助,但您通常不需要同时使用所有标准测试:

# Rails provided Object#blank? method
nil.blank? # => true
false.blank? # => true
''.blank? # => true
[ ].blank? # => true

# Ruby provided Object#nil? method
nil.nil? # => true
false.nil? # => false
''.nil? # => false
[ ].nil # => false

# Ruby class-specific #empty? method
nil.empty? # => error
false.empty? # => error
''.empty? # => true
[ ].empty? # => true

在你的情况下,你可能正在寻找的测试实际上是一个完全不同的测试。与blank?相反的是present?,它对于这种情况非常方便。您甚至可以将两个反向逻辑测试折叠成一个简单的三元查询:

- @project_invoice = proj.present? ? proj.invoice : 0

更详细地看起来像这样:

- if (proj.present?)
  @project_invoice = proj.invoice
- else
  @project_invoice = 0

本方法验证变量是否代表某种非零,非空白值。

答案 1 :(得分:0)

第二个条件有一个拼写错误的变量名。它应该是 proj ,而不是 projt

那会导致你的问题。

答案 2 :(得分:0)

如果发票栏是nill,那么!proj.invoice.blank?评估为false,下一个测试完成,!projt.invoice.empty?

由于发票是零,你有nil.empty?这是一个错误,是空的?不能在零上运行。

ruby-1.9.2-p0 > !nil.blank? || !nil.empty?
NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.empty?

我认为你做得太过分了,因为整数不应该是一个数组。我认为你应该将它缩短为只测试blank?,因为它也会捕获一个空数组。

答案 3 :(得分:0)

这是您正在使用的代码。如果这是相同的代码,我会看到拼写错误 第二行。

你可以试试吗

=proj.invoice if !proj.invoice.blank? || !proj.invoice.empty? || !proj.invoice.nil?
相关问题