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 に答える