2011-03-10 75 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