Fivell
Fivell

Reputation: 11929

rails 3 REST: activeresource destroy validation

Hi all I'm using active_resource and have next question. sometimes there is destroy validation needed Example

 def destroy
      if @user.destroy
        head :ok
      else
        respond_with(@user)
      end  
  end

user model can't be deleted in few cases. If it wasn't delete @user contains errors after validation before_delete and responder serialize it like that => {\"errors\":{\"id\":[\"Cannot delete user with orders\"]}}

but active_resource don't handle such response and fails with

ActiveResource::ResourceInvalid: Failed.  Response code = 422.  Response message = .

what is the best way to handle such situations?

Upvotes: 2

Views: 1119

Answers (2)

Fivell
Fivell

Reputation: 11929

so I did this way

module ActiveResource

  class Base
     def destroy_with_validation
         begin
           destroy
          rescue ActiveResource::ResourceInvalid=>error
            @remote_errors = error
            load_remote_errors(@remote_errors, true)
            return false
          end    
      end
 end

Upvotes: 2

basgys
basgys

Reputation: 4400

I have never used ActiveResource so far, however I think this is the right way to implement a destroy method... or at least it's the REST way.

You said ActiveResource doesn't handle such response, but actually that's exactly the opposite. The ActiveResource::ResourceInvalid error is raised because of the 422 (Unprocessable Entity) response.

More infos here : API ActiveResource

Here is what the Resource errors part says :

The following HTTP response codes will also result in these exceptions:

...

422 - ActiveResource::ResourceInvalid (rescued by save as validation errors)

To sum up, these errors allow you to handle and behave accurately depending on the status code returned. For instance you don't act the same way whether the response is a 503 (Service Unavailable) or a 422 (Unprocessable Entity). In first case you will probably said "Try again later" and in the second one "Cannot do that because of [message returned]".

Upvotes: 1

Related Questions