2011-03-10 77 views
3

我的“项目”表具有发票作为整数属性,在这里我把零对象的这个属性在DB中。评估期间nil.empty?发生。在HAML的一些推广书面 代码ROR +错误nil.empty?而运行代码

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

    [email protected]_invoice=0 if proj.invoice.blank? || proj.invoice.empty? || proj.invoice.nil 

我收到此错误时运行的代码。

NoMethodError:当你没有想到它时,你有一个零对象! 您可能预期了Array的一个实例。 评估nil.empty时发生错误?

回答

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 

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

+0

真的很好,这个单一的陈述减少了我的代码行。 Thanx – Rubyist 2011-03-10 05:22:27

+0

@ tadman..so'empty?'是为字符串,数组和散列而定义的......它是正确的吗? – rubyprince 2011-03-10 08:58:53

+0

'空?'是为很多东西定义的,'String','Array'和'Hash'就是很好的例子,但还有其他的,因为它是一个常用的方法名称。 'nil'没有相应的方法。 – tadman 2011-03-10 18:37:09

0

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

这会导致您的问题。

+0

如果proj.invoice我无,那么它仍然是一个错误。 – DGM 2011-03-10 04:00:12

+0

不,我检查了一个相同的问题出现 – Rubyist 2011-03-10 04:00:57

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?,因为它也捕获一个空阵列。

+0

或许你的意思!(proj.invoice.blank?|| proj.invoice.empty?|| proj.invoice.nil?)这在逻辑上与!proj.invoice相同。空白? &&!proj.invoice.empty? &&!proj.invoice.nil? ...但不必要为空白?照顾所有情况。 – DGM 2011-03-10 04:06:48

0

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

你可以尝试用

=proj.invoice if !proj.invoice.blank? || !proj.invoice.empty? || !proj.invoice.nil? 
+1

如果proj.invoice是零,你不能检查.empty?在上面。 – DGM 2011-03-10 04:04:17