2012-10-24 10 views
8

Ho un validatore molto generico e voglio passarlo argomenti.Rails/ActiveModel che passa gli argomenti a EachValidator

Ecco un esempio modello:

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 

e Esempio validatore:

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 

C'è un modo per passare argomenti al validatore dipende da quale campo si sta convalidando?

grazie

+0

Cosa stai cercando di ottenere in questo modo? Questo non mi sembra il modo migliore per farlo data l'API Rails. – dpassage

+0

Nel mio codice originale voglio scoprire se c'è una dipendenza ciclica nel mio modello. ModelA ha molti modelli B. Il modello B ha un modello A. Voglio convalidare che non esiste un ciclo dal modello A a se stesso. Il fatto è che ho due relazioni diverse che devono convalidare i cicli e c'è una differenza minima tra il validatore. Volevo vedere se potevo farlo passare genericamente quali campi cercare i cicli invece di riscrivere la stessa logica del ciclo e validatore. – GTDev

+0

Penso che potrebbe essere meglio usare la sottoclasse per quella invece della parametrizzazione. – dpassage

risposta

13

non ero a conoscenza di questa operazione, ma se si vuole passare un argomento, poi passano un hash per generic: invece di true. This post dettagli il processo esatto hai intenzione di seguire:

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 dovrebbero ora avere accesso a entrambi gli argomenti hai intenzione di passare la convalida: options[:order_type] e options[:task_type].

Si potrebbe avere più senso, tuttavia, a dividere questi in due validatori, sia con ereditare il comportamento condiviso come detto da dpassage:

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