2012-07-22 37 views
1

我正在通過我的新項目,其中proc用於驗證,我沒有理解。 任何人都可以請解釋我在這裏發生了什麼?我們爲什麼要使用PROC這裏,爲什麼我們不能檢查datefield.export_date_format.present我的代碼是這樣的一個模型驗證過程

before_validation :strip_whitespace, :if => proc{|datefield|datefield.export_date_format.present?} 

def strip_whitespace 
    self.export_date_format.strip! 
end 

?在if條件下直接調用:strip_whitespace方法?.什麼是proc在這裏做什麼?

回答

0

1.爲什麼不直接在方法中檢查格式?也許這是設計的一部分,以保持方法和程序調用該方法或不作爲兩個不同的參數。 proc在這裏是對象,這就是爲什麼可以通過該過程作爲參數,因爲proc是first class object

2.在地方定義過程權限然後定義方法然後調用此方法一次很方便。這就是所謂的其他語言中的匿名函數。

3.有時只能定義只能proc或lambda的過程。例如,在#108 named_scope瑞安貝茨不得不使用拉姆達:

lambda {|*args| {:conditions => ["released_at > ?",(args.first || 2.weeks.ago)]}} 

因爲表達2.weeks.ago應該在這個時候拉姆達呼籲,但當時沒有被加載時表達的時間進行評估。