Rails/ActiveModel передает аргументы в EachValidator

у меня есть очень универсальный валидатор и я хочу передать его аргументы.

вот пример модели:

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

есть ли способ передать аргументы валидатору в зависимости от того, какое поле он проверяет?

спасибо

1 ответов


Я тоже не знал об этом, но если вы хотите передать аргумент, то передайте хэш generic: вместо true. этот пост подробности точный процесс, который вы хотите следовать:

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 теперь должен иметь доступ к обоим аргументам, которые вы хотите передать в проверке:options[:order_type] и options[:task_type].

было бы разумнее, однако, разделить их на два валидатора, причем оба наследуют общее поведение, упомянутое 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