Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Make Active Resource use ActiveModel::Errors

  • Loading branch information...
commit 77acfefedf80a2c30f8a0f71b5b6d33d1b9fd144 1 parent 638333b
@lifo lifo authored
View
7 activemodel/lib/active_model/errors.rb
@@ -107,7 +107,12 @@ def full_messages(options = {})
if attribute == :base
messages.each {|m| full_messages << m }
else
- attr_name = @base.class.human_attribute_name(attribute.to_s)
+ if @base.class.respond_to?(:human_attribute_name)
+ attr_name = @base.class.human_attribute_name(attribute.to_s)
+ else
+ attr_name = attribute.to_s.humanize
+ end
+
prefix = attr_name + I18n.t('activerecord.errors.format.separator', :default => ' ')
messages.each do |m|
full_messages << "#{prefix}#{m}"
View
4 activerecord/lib/active_record.rb
@@ -35,9 +35,7 @@
require 'active_model'
rescue LoadError
$:.unshift "#{File.dirname(__FILE__)}/../../activemodel/lib"
- require 'active_model'
-else
-
+ require 'active_model'
end
module ActiveRecord
View
7 activeresource/lib/active_resource.rb
@@ -31,6 +31,13 @@
end
end
+begin
+ require 'active_model'
+rescue LoadError
+ $:.unshift "#{File.dirname(__FILE__)}/../../activemodel/lib"
+ require 'active_model'
+end
+
require 'active_resource/formats'
require 'active_resource/base'
require 'active_resource/validations'
View
196 activeresource/lib/active_resource/validations.rb
@@ -4,201 +4,7 @@ class ResourceInvalid < ClientError #:nodoc:
# Active Resource validation is reported to and from this object, which is used by Base#save
# to determine whether the object in a valid state to be saved. See usage example in Validations.
- class Errors
- include Enumerable
- attr_reader :errors
-
- delegate :empty?, :to => :errors
-
- def initialize(base) # :nodoc:
- @base, @errors = base, {}
- end
-
- # Add an error to the base Active Resource object rather than an attribute.
- #
- # ==== Examples
- # my_folder = Folder.find(1)
- # my_folder.errors.add_to_base("You can't edit an existing folder")
- # my_folder.errors.on_base
- # # => "You can't edit an existing folder"
- #
- # my_folder.errors.add_to_base("This folder has been tagged as frozen")
- # my_folder.valid?
- # # => false
- # my_folder.errors.on_base
- # # => ["You can't edit an existing folder", "This folder has been tagged as frozen"]
- #
- def add_to_base(msg)
- add(:base, msg)
- end
-
- # Adds an error to an Active Resource object's attribute (named for the +attribute+ parameter)
- # with the error message in +msg+.
- #
- # ==== Examples
- # my_resource = Node.find(1)
- # my_resource.errors.add('name', 'can not be "base"') if my_resource.name == 'base'
- # my_resource.errors.on('name')
- # # => 'can not be "base"!'
- #
- # my_resource.errors.add('desc', 'can not be blank') if my_resource.desc == ''
- # my_resource.valid?
- # # => false
- # my_resource.errors.on('desc')
- # # => 'can not be blank!'
- #
- def add(attribute, msg)
- @errors[attribute.to_s] = [] if @errors[attribute.to_s].nil?
- @errors[attribute.to_s] << msg
- end
-
- # Returns true if the specified +attribute+ has errors associated with it.
- #
- # ==== Examples
- # my_resource = Disk.find(1)
- # my_resource.errors.add('location', 'must be Main') unless my_resource.location == 'Main'
- # my_resource.errors.on('location')
- # # => 'must be Main!'
- #
- # my_resource.errors.invalid?('location')
- # # => true
- # my_resource.errors.invalid?('name')
- # # => false
- def invalid?(attribute)
- !@errors[attribute.to_s].nil?
- end
-
- # A method to return the errors associated with +attribute+, which returns nil, if no errors are
- # associated with the specified +attribute+, the error message if one error is associated with the specified +attribute+,
- # or an array of error messages if more than one error is associated with the specified +attribute+.
- #
- # ==== Examples
- # my_person = Person.new(params[:person])
- # my_person.errors.on('login')
- # # => nil
- #
- # my_person.errors.add('login', 'can not be empty') if my_person.login == ''
- # my_person.errors.on('login')
- # # => 'can not be empty'
- #
- # my_person.errors.add('login', 'can not be longer than 10 characters') if my_person.login.length > 10
- # my_person.errors.on('login')
- # # => ['can not be empty', 'can not be longer than 10 characters']
- def on(attribute)
- errors = @errors[attribute.to_s]
- return nil if errors.nil?
- errors.size == 1 ? errors.first : errors
- end
-
- alias :[] :on
-
- # A method to return errors assigned to +base+ object through add_to_base, which returns nil, if no errors are
- # associated with the specified +attribute+, the error message if one error is associated with the specified +attribute+,
- # or an array of error messages if more than one error is associated with the specified +attribute+.
- #
- # ==== Examples
- # my_account = Account.find(1)
- # my_account.errors.on_base
- # # => nil
- #
- # my_account.errors.add_to_base("This account is frozen")
- # my_account.errors.on_base
- # # => "This account is frozen"
- #
- # my_account.errors.add_to_base("This account has been closed")
- # my_account.errors.on_base
- # # => ["This account is frozen", "This account has been closed"]
- #
- def on_base
- on(:base)
- end
-
- # Yields each attribute and associated message per error added.
- #
- # ==== Examples
- # my_person = Person.new(params[:person])
- #
- # my_person.errors.add('login', 'can not be empty') if my_person.login == ''
- # my_person.errors.add('password', 'can not be empty') if my_person.password == ''
- # messages = ''
- # my_person.errors.each {|attr, msg| messages += attr.humanize + " " + msg + "<br />"}
- # messages
- # # => "Login can not be empty<br />Password can not be empty<br />"
- #
- def each
- @errors.each_key { |attr| @errors[attr].each { |msg| yield attr, msg } }
- end
-
- # Yields each full error message added. So Person.errors.add("first_name", "can't be empty") will be returned
- # through iteration as "First name can't be empty".
- #
- # ==== Examples
- # my_person = Person.new(params[:person])
- #
- # my_person.errors.add('login', 'can not be empty') if my_person.login == ''
- # my_person.errors.add('password', 'can not be empty') if my_person.password == ''
- # messages = ''
- # my_person.errors.each_full {|msg| messages += msg + "<br/>"}
- # messages
- # # => "Login can not be empty<br />Password can not be empty<br />"
- #
- def each_full
- full_messages.each { |msg| yield msg }
- end
-
- # Returns all the full error messages in an array.
- #
- # ==== Examples
- # my_person = Person.new(params[:person])
- #
- # my_person.errors.add('login', 'can not be empty') if my_person.login == ''
- # my_person.errors.add('password', 'can not be empty') if my_person.password == ''
- # messages = ''
- # my_person.errors.full_messages.each {|msg| messages += msg + "<br/>"}
- # messages
- # # => "Login can not be empty<br />Password can not be empty<br />"
- #
- def full_messages
- full_messages = []
-
- @errors.each_key do |attr|
- @errors[attr].each do |msg|
- next if msg.nil?
-
- if attr == "base"
- full_messages << msg
- else
- full_messages << [attr.humanize, msg].join(' ')
- end
- end
- end
- full_messages
- end
-
- def clear
- @errors = {}
- end
-
- # Returns the total number of errors added. Two errors added to the same attribute will be counted as such
- # with this as well.
- #
- # ==== Examples
- # my_person = Person.new(params[:person])
- # my_person.errors.size
- # # => 0
- #
- # my_person.errors.add('login', 'can not be empty') if my_person.login == ''
- # my_person.errors.add('password', 'can not be empty') if my_person.password == ''
- # my_person.error.size
- # # => 2
- #
- def size
- @errors.values.inject(0) { |error_count, attribute| error_count + attribute.size }
- end
-
- alias_method :count, :size
- alias_method :length, :size
-
+ class Errors < ::ActiveModel::Errors
# Grabs errors from the XML response.
def from_xml(xml)
clear
View
2  activeresource/test/base_errors_test.rb
@@ -28,7 +28,7 @@ def test_should_parse_errors_to_individual_attributes
def test_should_iterate_over_errors
errors = []
- @person.errors.each { |attribute, message| errors << [attribute, message] }
+ @person.errors.each { |attribute, message| errors << [attribute.to_s, message] }
assert errors.include?(["name", "can't be blank"])
end
Please sign in to comment.
Something went wrong with that request. Please try again.