aboutsummaryrefslogtreecommitdiffstats
path: root/activeresource/lib
diff options
context:
space:
mode:
authorPratik Naik <pratiknaik@gmail.com>2009-03-19 23:45:08 +0000
committerPratik Naik <pratiknaik@gmail.com>2009-03-19 23:45:08 +0000
commit77acfefedf80a2c30f8a0f71b5b6d33d1b9fd144 (patch)
tree8ee169fa9dc6cd1dcc9e221e196dd0665234d78f /activeresource/lib
parent638333b7a17234ed65b2e8b0bee3d9b533446803 (diff)
downloadrails-77acfefedf80a2c30f8a0f71b5b6d33d1b9fd144.tar.gz
rails-77acfefedf80a2c30f8a0f71b5b6d33d1b9fd144.tar.bz2
rails-77acfefedf80a2c30f8a0f71b5b6d33d1b9fd144.zip
Make Active Resource use ActiveModel::Errors
Diffstat (limited to 'activeresource/lib')
-rw-r--r--activeresource/lib/active_resource.rb7
-rw-r--r--activeresource/lib/active_resource/validations.rb196
2 files changed, 8 insertions, 195 deletions
diff --git a/activeresource/lib/active_resource.rb b/activeresource/lib/active_resource.rb
index db9007060f..f0d30b1624 100644
--- a/activeresource/lib/active_resource.rb
+++ b/activeresource/lib/active_resource.rb
@@ -31,6 +31,13 @@ rescue LoadError
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'
diff --git a/activeresource/lib/active_resource/validations.rb b/activeresource/lib/active_resource/validations.rb
index de3339935f..ca01ed3c75 100644
--- a/activeresource/lib/active_resource/validations.rb
+++ b/activeresource/lib/active_resource/validations.rb
@@ -4,201 +4,7 @@ module ActiveResource
# 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