10

Je cherchais depuis longtemps et je n'arrive pas encore à trouver une réponse satisfaisante. J'ai deux applications. FrontApp et BackApp. FrontApp a une ressource active qui imite un modèle dans BackApp. Toutes les validations au niveau du modèle se trouvent dans BackApp et je dois gérer ces validations BackApp dans FrontApp.Gestion des erreurs ActiveResource

Je suit le code actif-ressource:

class RemoteUser < ActiveResource::Base 
    self.site = SITE 
    self.format = :json 
    self.element_name = "user" 
end 

Cela imite un modèle qui est le suivant

class User < ActiveRecord::Base 

    attr_accessor :username, :password 

    validates_presence_of :username 
    validates_presence_of :password 
end 

Chaque fois que je crée une nouvelle RemoteUser en application avant; J'appelle .save dessus. par exemple:

user = RemoteSession.new(:username => "user", :password => "") 
user.save 

Cependant, étant donné que le mot de passe est vide, je dois passer en arrière les erreurs à FrontApp de BackApp. Cela n'arrive pas. Je ne comprends tout simplement pas comment le faire avec succès. Cela doit être un scénario d'intégration commun; mais il ne semble pas y avoir une bonne documentation pour cela?

Mon contrôleur reposant qui agit comme un proxy est la suivante:

class UsersController < ActionController::Base 
    def create 
    respond_to do |format| 
     format.json do 
     user = User.new(:username => params[:username], :password => params[:password]) 
     if user.save 
      render :json => user 
     else 
      render :json => user.errors, :status => :unprocessable_entity 
     end 
     end 
    end 
    end 
end 

Qu'est-ce que je suis absent? Toute aide sera très appréciée.

Vive

Répondre

13

des rails code source, je compris que la raison ActiveResource n'a pas eu d'erreurs était parce que je ne pas attribuer des erreurs à la tag « erreurs » dans JSON. C'est non documenté mais nécessaire. :)

donc mon code aurait dû être:

render :json => {:errors => user.errors}, :status => :unprocessable_entity 
+0

'format.json {render: json => {: erreurs => @ customer.errors},: status =>: unprocessable_entity}' ----> Cela fonctionnera ..... J'ai aussi eu le même problème parce que J'utilisais le code comme @ customer.errors.full_messages, il n'attribue pas et ne renvoie pas l'application de ressource active –

1

Dans le code:

class UsersController < ActionController::Base 
    def create 
    respond_to do |format| 
     format.json do 
     user = User.new(:username => params[:username], :password => params[:password]) 
     if user.save 
      render :json => user 
     else 
      render :json => user.errors, :status => :unprocessable_entity 
     end 
     end 
    end 
    end 
end 

essayer de remplacer

user = User.new(:username => params[:username], :password => params[:password]) 

avec

user = User.new(params[:user]) 

Votre modèle ressource active passer les params comme le hachage ci-dessus :

:user => { :username => "xpto", :password => "yst" } 
+0

Merci pour le conseil, mais cela contribuerait-il de toute façon à résoudre le problème auquel je suis confronté? – Priyank

+0

Cela semble être la seule erreur dans votre code. J'ai pensé que peut-être cette erreur ne faisait pas le modèle remplir les erreurs. Si cela n'a pas aidé, je suis désolé mais je ne sais pas quoi d'autre à essayer. – robertokl

1

Cette solution a fonctionné pour moi: https://stackoverflow.com/a/10051362/311744

action update:

def update 
    @user = User.find(params[:id]) 

    respond_to do |format| 
     if @user.update_attributes(params[:user]) 
     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { 

      render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

contrôleur d'appel:

@remote_user = RemoteUser.find(params[:id]) 
if (@remote_user.update_attributes(params[:remote_user])) 
    redirect_to([:admin, @remote_user], notice: 'Remote user was successfully updated.') 
else 
    flash[:error] = @remote_user.errors.full_messages 
    render action: 'edit' 
end