选项

2012-08-01 73 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