2012-10-24 15 views
8

Ich habe eine sehr generische Validator und ich möchte Argumente übergeben. HierRails/ActiveModel Übergabe von Argumenten an EachValidator

ist ein Beispiel Modell:

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 

und Beispiel-Validator:

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 

Gibt es eine Möglichkeit Argumente an den Validator abhängig von zu übergeben, welches Feld er die Validierung ist?

dank

+0

Was versuchen Sie, indem Sie dies zu erreichen? Dies erscheint mir nicht als der beste Weg, dies angesichts der Rails API zu tun. – dpassage

+0

In meinem ursprünglichen Code möchte ich herausfinden, ob es in meinem Modell eine zyklische Abhängigkeit gibt. Modell A hat viele Modell B. Modell B hat ein Modell A. Ich möchte bestätigen, dass es keinen Zyklus von Modell A zurück zu sich selbst gibt. Die Sache ist, ich habe zwei verschiedene Beziehungen, die Zyklen validieren müssen, und es gibt einen minimalen Unterschied im Validator zwischen ihnen. Ich wollte sehen, ob ich es generisch passieren lassen könnte, welche Felder nach Zyklen suchen, anstatt die gleiche Zykluslogik und den gleichen Validator zu schreiben. – GTDev

+0

Ich denke, dass Sie besser dafür Unterklassen anstelle der Parametrisierung verwenden können. – dpassage

Antwort

13

war ich entweder nicht bewusst, aber wenn Sie ein Argument übergeben wollen, dann einen Hash zu generic: statt true passieren. This post Details den genauen Prozess Sie folgen wollen, sind:

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 nun Zugriff auf beide Argumente haben, sollten Sie bei der Validierung passieren wollen, sind: options[:order_type] und options[:task_type].

Es könnte mehr Sinn machen, diese jedoch in zwei Validatoren aufzuteilen, wobei beide erben das gemeinsame Verhalten von dpassage erwähnt als:

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