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”,而不是其中的值。请帮忙!

4

1 回答 1

2

当你传入 时:attr => :uid,你只是传入一个符号。这里没有发生什么神奇的事情——它只是获取你附加的选项的哈希值并将其作为options哈希值传递。所以当你写它时,你会看到你已经通过的符号。

你可能想要的是

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

因为validates_with是类方法,所以无法在选项哈希中获取单个记录的值。如果您对更 DRY 的版本感兴趣,可以尝试以下方法:

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

您传入要评估的字段名称的位置。

于 2012-08-01T03:31:42.107 回答