2015-10-28 27 views
0

我有一個很難理解我們如何能夠寫出下面一行:在Rails中驗證類方法或實例方法嗎?

validates :email, presence: true 

我認爲,這是類方法,因爲下面的代碼在Rails的完美執行。

class User < ActiveRecord::Base 
    self.validates :email, presence: true 
end 

但是,當我去Rails的源代碼,我又知道validates是一個實例方法,而不是一個類的方法,並在類定義寫self.validates給我的印象是,它是類方法。

這是它是如何在Rails中被定義爲:

def validates(*attributes) 
    defaults = attributes.extract_options!.dup 
    validations = defaults.slice!(*_validates_default_keys) 

    raise ArgumentError, "You need to supply at least one attribute" if attributes.empty? 
    raise ArgumentError, "You need to supply at least one validation" if validations.empty? 

    defaults[:attributes] = attributes 

    validations.each do |key, options| 
     next unless options 
     key = "#{key.to_s.camelize}Validator" 

     begin 
     validator = key.include?('::') ? key.constantize : const_get(key) 
     rescue NameError 
     raise ArgumentError, "Unknown validator: '#{key}'" 
     end 

     validates_with(validator, defaults.merge(_parse_validates_options(options))) 
    end 
end 

它是實際?

+2

實例方法,當然。問題是,在哪個對象上? :) –

+0

如果你不知道,類是紅寶石對象,他們也有實例方法(你可能認爲是「類方法」,但在紅寶石中沒有這種東西) –

+0

@SergioTulentsev我會說我之前並沒有感到困惑。 :)你想引用我任何文章或資源來進一步獲得這個東西嗎? –

回答

4

這是一個class method :)

作爲評價塞爾吉奧點,因爲在每一個紅寶石類是一個對象(類Class的實例),validatesClass的實例的方法。

您的User類從ActiveRecord::Base繼承了一堆東西。其中繼承的東西有Validations模塊。


旁註: 關注此coolest videoRuby對象模型通過Dave Thomas - 事情會變得更加-更清晰!

+0

我已經接受了你的答案,但我認爲我真的需要深入研究* class-object-stuff *來真正理解這個事情。 –

+2

@ArslanAli:閱讀一本名爲「metaprogramming ruby​​」的書,它應該幫助 –

+1

@ArslanAli看到編輯和耶!元編程Ruby也是瞭解你需要什麼的好工具 –