我的“项目”表将发票作为整数属性,这里我将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?
时发生错误答案 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?