Class: ActiveModel::Errors

Inherits:
Object
  • Object
show all
Defined in:
lib/active_model/dynamic_errors.rb

Instance Method Summary collapse

Instance Method Details

#full_messagesObject

Redefine the ActiveModel::Errors::full_messages method:

Returns all the full error messages in an array. 'Base' messages are handled as usual.
Non-base messages are prefixed with the attribute name as usual UNLESS

(1) they begin with ‘^’ in which case the attribute name is omitted.

E.g. validates_acceptance_of :accepted_terms, :message => '^Please accept the terms of service'

(2) the message is a proc, in which case the proc is invoked on the model object.

E.g. validates_presence_of :assessment_answer_option_id, 
:message => Proc.new { |aa| "#{aa.label} (#{aa.group_label}) is required" }
which gives an error message like:
Rate (Accuracy) is required


13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/active_model/dynamic_errors.rb', line 13

def full_messages
  full_messages = []

  each do |error|
    if error.attribute == :base
      full_messages << error.message
    else
      attr_name = error.attribute.to_s.gsub('.', '_').humanize
      attr_name = @base.class.human_attribute_name(error.attribute, :default => attr_name)
      options = { :default => "%{attribute} %{message}", :attribute => attr_name }

      if error.message =~ /^\^/
        options[:default] = "%{message}"
        full_messages << I18n.t(:"errors.dynamic_format", **options.merge(:message => error.message[1..-1]))
      elsif error.message.is_a? Proc
        options[:default] = "%{message}"
        full_messages << I18n.t(:"errors.dynamic_format", **options.merge(:message => error.message.call(@base)))
      else
        full_messages << I18n.t(:"errors.format", **options.merge(:message => error.message))
      end
    end
  end

  full_messages
end