Method: ActiveModel::Errors#add

Defined in:
lib/reactive_record/active_record/errors.rb

#add(attribute, message = :invalid, options = {}) ⇒ Object

NOTE: strict option isn’t ported yet

Adds message to the error messages and used validator type to details on attribute. More than one error can be added to the same attribute. If no message is supplied, :invalid is assumed.

person.errors.add(:name)
# => ["is invalid"]
person.errors.add(:name, :not_implemented, message: "must be implemented")
# => ["is invalid", "must be implemented"]

person.errors.messages
# => {:name=>["is invalid", "must be implemented"]}

person.errors.details
# => {:name=>[{error: :not_implemented}, {error: :invalid}]}

If message is a symbol, it will be translated using the appropriate scope (see generate_message).

If message is a proc, it will be called, allowing for things like Time.now to be used within an error.

If the :strict option is set to true, it will raise ActiveModel::StrictValidationFailed instead of adding the error. :strict option can also be set to any other exception.

person.errors.add(:name, :invalid, strict: true)
# => ActiveModel::StrictValidationFailed: Name is invalid
person.errors.add(:name, :invalid, strict: NameIsInvalid)
# => NameIsInvalid: Name is invalid

person.errors.messages # => {}

attribute should be set to :base if the error is not directly associated with a single attribute.

person.errors.add(:base, :name_or_email_blank,
  message: "either name or email must be present")
person.errors.messages
# => {:base=>["either name or email must be present"]}
person.errors.details
# => {:base=>[{error: :name_or_email_blank}]}


294
295
296
297
298
299
300
301
302
303
304
# File 'lib/reactive_record/active_record/errors.rb', line 294

def add(attribute, message = :invalid, options = {})
  message = message.call if message.respond_to?(:call)
  detail  = normalize_detail(message, options)
  message = normalize_message(attribute, message, options)
  # if exception = options[:strict]
  #   exception = ActiveModel::StrictValidationFailed if exception == true
  #   raise exception, full_message(attribute, message)
  # end
  details[attribute.to_sym]  << detail
  (messages[attribute.to_sym] << message).tap { reactive_empty! false }
end