8

私は非常に一般的なバリデータを持っており、引数を渡したいと思います。ここで引数をEachValidatorに渡すRails/ActiveModel

は例のモデルである:

class User 
    include Mongoid::Document 

    field :order_type 
    has_many :orders, inverse_of :user 
    validates: orders, generic: true #i want to pass argument (order_type) 

    field :task_type 
    has_many :tasks, inverse_of :user 
    validates: tasks, generic: true #i want to pass argument (task_type) 
end 

と例のバリデータ:

class GenericValidator < ActiveModel::EachValidator 
    def validate_each(object, attribute, value) 
    if some_validation?(object) 
     object.errors[attribute] << (options[:message] || "is not formatted properly") 
    end 
    end 
end 

は、それが検証を行っている依存どのフィールドにバリに引数を渡す方法はありますか?

おかげ

+0

あなたがこれを行うことによって達成するために何をしようとしていますか?これは、Rails APIを使用した場合、これを行うための最良の方法として私を襲ってきません。 – dpassage

+0

私のオリジナルコードでは、私のモデルに周期的な依存性があるかどうかを調べたいと思います。モデルAには多くのモデルBがあります。モデルBには1つのモデルAがあります。モデルAからそれまでのサイクルがないことを検証したいと思います。事は、サイクルを検証する必要がある2つの異なる関係があり、それらの間のバリデーターにはごくわずかな違いがあるということです。同じサイクルロジックとバリデーターを書き換えるのではなく、どのフィールドをサイクルを検索するために一般的に渡すことができるかどうかを見たいと思っていました。 – GTDev

+0

私は、パラメータ化ではなくサブクラス化を使うほうが良いかもしれないと思います。 – dpassage

答えて

13

私はどちらかこのことを認識していなかったが、あなたは、引数を渡したい場合は、generic:代わりのtrueにハッシュを渡します。 This postはあなたが従うことを希望している正確なプロセスを詳しく説明:options[:order_type]options[:task_type]

class User 
    include Mongoid::Document 

    field :order_type 
    has_many :orders, inverse_of :user 
    validates: orders, generic: { :order_type => order_type } 

    field :task_type 
    has_many :tasks, inverse_of :user 
    validates: tasks, generic: { :task_type => task_type } 
end 

GenericValidatorは今、あなたが検証に合格したいとしている両方の引数へのアクセス権を持っている必要があります。

それはdpassageで述べたように、両方が共有振る舞いを継承し、2つのバリにこれらを分割するために、しかし、より多くの意味をなすかもしれません:

class User 
    include Mongoid::Document 

    field :order_type 
    has_many :orders, inverse_of :user 
    validates: orders, order: { type: order_type } 

    field :task_type 
    has_many :tasks, inverse_of :user 
    validates: tasks, task: { type: task_type } 
    end