aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel/lib/active_model/errors.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activemodel/lib/active_model/errors.rb')
-rw-r--r--activemodel/lib/active_model/errors.rb80
1 files changed, 80 insertions, 0 deletions
diff --git a/activemodel/lib/active_model/errors.rb b/activemodel/lib/active_model/errors.rb
new file mode 100644
index 0000000000..a99bb001e4
--- /dev/null
+++ b/activemodel/lib/active_model/errors.rb
@@ -0,0 +1,80 @@
+module ActiveModel
+ class Errors < Hash
+ include DeprecatedErrorMethods
+
+ @@default_error_messages = {
+ :inclusion => "is not included in the list",
+ :exclusion => "is reserved",
+ :invalid => "is invalid",
+ :confirmation => "doesn't match confirmation",
+ :accepted => "must be accepted",
+ :empty => "can't be empty",
+ :blank => "can't be blank",
+ :too_long => "is too long (maximum is %d characters)",
+ :too_short => "is too short (minimum is %d characters)",
+ :wrong_length => "is the wrong length (should be %d characters)",
+ :taken => "has already been taken",
+ :not_a_number => "is not a number",
+ :greater_than => "must be greater than %d",
+ :greater_than_or_equal_to => "must be greater than or equal to %d",
+ :equal_to => "must be equal to %d",
+ :less_than => "must be less than %d",
+ :less_than_or_equal_to => "must be less than or equal to %d",
+ :odd => "must be odd",
+ :even => "must be even"
+ }
+
+ # Holds a hash with all the default error messages that can be replaced by your own copy or localizations.
+ cattr_accessor :default_error_messages
+
+ alias_method :get, :[]
+ alias_method :set, :[]=
+
+ def [](attribute)
+ if errors = get(attribute.to_sym)
+ errors.size == 1 ? errors.first : errors
+ else
+ set(attribute.to_sym, [])
+ end
+ end
+
+ def []=(attribute, error)
+ self[attribute.to_sym] << error
+ end
+
+ def each
+ each_key do |attribute|
+ self[attribute].each { |error| yield attribute, error }
+ end
+ end
+
+ def size
+ values.flatten.size
+ end
+
+ def to_a
+ inject([]) do |errors_with_attributes, (attribute, errors)|
+ if error.blank?
+ errors_with_attributes
+ else
+ if attr == :base
+ errors_with_attributes << error
+ else
+ errors_with_attributes << (attribute.to_s.humanize + " " + error)
+ end
+ end
+ end
+ end
+
+ def to_xml(options={})
+ options[:root] ||= "errors"
+ options[:indent] ||= 2
+ options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
+
+ options[:builder].instruct! unless options.delete(:skip_instruct)
+ options[:builder].errors do |e|
+ to_a.each { |error| e.error(error) }
+ end
+ end
+ end
+end \ No newline at end of file