Module to support validation and errors with Active Resource objects. The module overrides 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.


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.on(:last_name)  # => "can't be empty"
  person.last_name = "Halpert"
  person.save                   # => true (and person is now saved to the remote service)
Show files where this module is defined (1 file)
Register or log in to add new notes.
October 1, 2009
0 thanks

ActiveResource validation is a little different

Given the following model on the remote end:

class Person < ActiveRecord::Base
 validates_presence_of :first_name, :last_name, :email

And this ActiveResource on the client end:

class Person < ActiveResource::Base
 self.site = "http://api.people.com:3000/" 

Validation messages will only be returned after an attempted save call on the client end - eg:

person = Person.new( :first_name => 'Billy', :emails => "william@anotherplanet.co.za" )
person.valid?                 # => true
person.errors.full_messages   # => []
person.save                   # => false
person.valid?                 # => false
person.errors.full_messages   # => ["Last name can't be empty"]

In ActiveResource::Base it is suggested that you can perform client site validation with something like this:

class Person < ActiveResource::Base
 self.site = "http://api.people.com:3000/"
  def validate
   errors.add("last name", "can't be empty") if last_name.blank?