Add option to bubble error messages from associated object
parent
ba354df619
commit
9fa5ebb212
|
@ -2,20 +2,45 @@
|
|||
|
||||
module ValidatesAssociatedWithContext
|
||||
class AssociatedWithContextValidator < ActiveModel::EachValidator # :nodoc:
|
||||
attr_reader :context, :inherit_context
|
||||
attr_reader :inherit_context, :bubble_messages
|
||||
|
||||
def initialize(options)
|
||||
@context = options.delete(:context)
|
||||
@inherit_context = options.delete(:inherit_context)
|
||||
@bubble_messages = options.delete(:bubble_messages)
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
def validate_each(record, attribute, value)
|
||||
validation_context = inherit_context ? record.validation_context : context
|
||||
def context(record)
|
||||
return record.validation_context if inherit_context
|
||||
|
||||
if Array(value).reject { |r| valid_object?(r, validation_context) }.any?
|
||||
record.errors.add(attribute, :invalid, **options.merge(value: value))
|
||||
if @context.respond_to?(:call)
|
||||
@context.call record
|
||||
else
|
||||
@context
|
||||
end
|
||||
end
|
||||
|
||||
def validate_each(record, attribute, value)
|
||||
validation_context = context(record)
|
||||
|
||||
if bubble_messages
|
||||
Array(value).each do |r|
|
||||
next if valid_object?(r, validation_context)
|
||||
|
||||
if r.errors.any?
|
||||
r.errors.each do |error|
|
||||
record.errors.add(attribute, error.full_message, **options.merge(value: r))
|
||||
end
|
||||
else
|
||||
record.errors.add(attribute, :invalid, **options.merge(value: r))
|
||||
end
|
||||
end
|
||||
else
|
||||
if Array(value).reject { |r| valid_object?(r, validation_context) }.any?
|
||||
record.errors.add(attribute, :invalid, **options.merge(value: value))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue