選項

2012-08-01 47 views
2

我不能夠訪問該值,如 'validates_with'選項

我的模型選項傳遞:

class Person < ActiveRecord::Base 
    include ActiveModel::Validations 
    attr_accessible :name, :uid 

    validates :name, :presence => "true" 
    validates :uid, :presence => "true" 
    validates_with IdValidator, :attr => :uid 

我的自定義驗證:

Class IdValidator < ActiveModel::Validator 

    def validate(record) 
    puts options[:attr] 
    ... 
    ... 
    end 
    end 

對於測試目的,我正在打印「options [:attr]」,我看到的只是終端中的「:uid」,而不是其中的值。請幫忙!

回答

2

當你通過:attr => :uid,你只是傳入一個符號。這裏沒有什麼奇妙的事情發生 - 它只需要你附加的選項的哈希值,並將其作爲options哈希散列。所以當你寫下它時,你會看到你傳遞的符號。

你可能想要的是

Class IdValidator < ActiveModel::Validator 
    def validate(record) 
    puts record.uid 
    ... 
    ... 
    end 
end 

因爲validates_with是一個類的方法,你不能在選項散列的個人記錄的值。如果你有興趣在一個更乾的版本,你可以嘗試這樣的:

class IdValidator < ActiveModel::Validator 
    def validate(record) 
     puts record[options[:field]] 
    end 
end 


class Person < ActiveRecord::Base 
    include ActiveModel::Validations 
    attr_accessible :name, :uid 

    validates :name, :presence => "true" 
    validates :uid, :presence => "true" 
    validates_with IdValidator, :field => :uid 
end 

你在哪裏你想要評估的字段的名稱通過。

+0

'puts record.uid'在我的模型中執行'validates_with IdValidator'時會起作用。當我有一個選項並且我想要訪問它時,問題就會出現。 – Gooner 2012-08-01 03:42:43

+0

我這樣做是因爲我打算讓我的驗證器幹掉,並允許不同的模型訪問相同的自定義驗證器。在另一個模型中,名稱'uid'可能具有不同的名稱。 – Gooner 2012-08-01 03:46:05

+0

那麼你要找的是'validates_with IdValidator,:attr => self.uid',我想? – workergnome 2012-08-01 13:56:33