Module to support validation and errors with
Active Resource objects. The module overrides ActiveResource::Base#save to rescue
ActiveResource::ResourceInvalid exceptions and parse the errors returned in
the web service response. The module also adds an errors
collection that mimics the interface of the errors provided by
ActiveRecord::Errors.
Example
Consider a Person resource on the server requiring both a
first_name
and a last_name
with a
validates_presence_of :first_name, :last_name
declaration in
the model:
person = Person.new(:first_name => "Jim", :last_name => "") person.save # => false (server returns an HTTP 422 status code and errors) person.valid? # => false person.errors.empty? # => false person.errors.count # => 1 person.errors.full_messages # => ["Last name can't be empty"] person.errors[:last_name] # => ["can't be empty"] person.last_name = "Halpert" person.save # => true (and person is now saved to the remote service)
- E
- S
- V
Validate a resource and save (POST) it to the remote web service. If any local validations fail - the save (POST) will not be attempted.
# File activeresource/lib/active_resource/validations.rb, line 71 def save_with_validation(options={}) perform_validation = options[:validate] != false # clear the remote validations so they don't interfere with the local # ones. Otherwise we get an endless loop and can never change the # fields so as to make the resource valid. @remote_errors = nil if perform_validation && valid? || !perform_validation save_without_validation true else false end rescue ResourceInvalid => error # cache the remote errors because every call to <tt>valid?</tt> clears # all errors. We must keep a copy to add these back after local # validations. @remote_errors = error load_remote_errors(@remote_errors, true) false end
Checks for errors on an object (i.e., is resource.errors empty?).
Runs all the specified local validations and returns true if no errors were added, otherwise false. Runs local validations (eg those on your Active Resource model), and also any errors returned from the remote system the last time we saved. Remote errors can only be cleared by trying to re-save the resource.
Examples
my_person = Person.create(params[:person]) my_person.valid? # => true my_person.errors.add('login', 'can not be empty') if my_person.login == '' my_person.valid? # => false