2009-03-26 6 views
0

Je lance un appel activeesource vers un service et j'aimerais recevoir des messages d'erreur personnalisés en retour. J'ai quelques validations qui ne sont pas des validations de modèle normales, donc je ne peux pas simplement renvoyer @ object.errors. Par exemple, l'une de mes validations est la suivante:Activer le statut de l'erreur et le corps de la réponse

Deux objets ont une relation plusieurs à plusieurs, mais je veux limiter un objet à un nombre limité (disons 2) de relations avec d'autres objets. Voici un code:

Dans le client:

response = Customer.find(customer_id).put(:add_user, :user_id => user_id) 

Cela met une demande d'ajout d'un utilisateur au client. Ensuite, dans le service, je veux vérifier que cette addition est valide.

def add_user  
@user = User.find(params[:user_id]) 
@customer = Customer.find(params[:id]) 
if @customer.users.length > 2 
    render :xml => "ERR_only_2_users_allowed", :status => :unprocessable_entity 
end 
end 

Voici mon problème. Dans la ressource active, si le statut de retour est une erreur, le côté client échoue complètement. Je pourrais changer le statut à 200 et je récupère le message d'erreur de corps bien, mais ceci semble vaincre le but d'avoir des codes de réponse d'erreur.

je peux mettre toute appel demande du client dans un begin/bloc de sauvetage

begin 
    response = Customer.find(customer_id).put(:add_user, :user_id => user_id) 
    rescue ActiveResource::ResourceInvalid => e 
    #return error code 
end 

mais quand je prends la réponse 422 (unprocessable_entity), je reçois rien du corps arrière, donc je n » t obtenir mon message d'erreur personnalisé. response = none

Est-ce que quelqu'un sait comment je peux réaliser ce message d'erreur personnalisé avec les codes de réponse appropriés?

Répondre

4

Cela peut ou peut ne pas être votre problème, mais les deux nous semblent très proches. J'utilise une méthode personnalisée, mais elle devrait aussi fonctionner pour vous. Qu'est-ce qui se passe, c'est que le code qui fait cela:

rescue ResourceInvalid => error 
    errors.from_xml(error.response.body) 
end 

Fonctionne uniquement avec la méthode de sauvegarde standard. Si vous voulez ajouter des erreurs lorsque d'autres méthodes sont appelées, il semble que vous deviez le faire vous-même.

je dû ajouter à fournisseur/rails/ActiveResource/lib/active_resource/custom_methods.rb

Voici ce que mon diff de git ressemble: ancien code:

def put(method_name, options = {}, body = '') 
    connection.put(custom_method_element_url(method_name, options), body, self.class.headers) 
end 

nouveau Donc, regardez la trace de la pile lorsque l'exception est levée pour le 422 et voyez la méthode qu'elle appelle exactement. Puis ajoutez quelque chose comme ce que j'ai et vous devriez être bon à faire. Ne me demandez pas pourquoi les gens de la source activeesource validations ne devraient fonctionner qu'avec leur méthode de sauvegarde. la méthode save crée ou met à jour, mais appeler 'put or post' est exactement la même chose, IMO. Si nous voulons que les validations fonctionnent, nous voulons qu'ils travaillent sur le put et le post ... de toute façon essayer.

Je ne suis pas sûr si j'ai besoin de l'auto à la fin ... je ne peux pas. Je n'ai pas complètement fini avec cela car je viens de comprendre comment le faire fonctionner. Erik

0

Je pense que votre problème pourrait être la réponse n'est pas un document XML, mais juste une chaîne de caractères. Essayez de changer votre déclaration à rendre quelque chose comme:

render :xml => { :error => "ERR_only_2_users_allowed" }, :status => :unprocessable_entity