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