我有一個很難理解我們如何能夠寫出下面一行:在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
它是實際?
實例方法,當然。問題是,在哪個對象上? :) –
如果你不知道,類是紅寶石對象,他們也有實例方法(你可能認爲是「類方法」,但在紅寶石中沒有這種東西) –
@SergioTulentsev我會說我之前並沒有感到困惑。 :)你想引用我任何文章或資源來進一步獲得這個東西嗎? –