10

Ho cercato per un po 'e ancora non riesco ancora a trovare una risposta soddisfacente. Ho due app. FrontApp e BackApp. FrontApp ha una risorsa attiva che imita un modello in BackApp. Tutte le convalide a livello di modello sono attive in BackApp e devo gestire le convalide di BackApp in FrontApp.Gestione degli errori ActiveResource

Ho seguente codice attiva di risorse:

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

Questo imita un modello che è la seguente

class User < ActiveRecord::Base 

    attr_accessor :username, :password 

    validates_presence_of :username 
    validates_presence_of :password 
end 

Ogni volta che creo un nuovo utente_remoto in App anteriore; Chiamo. Salve su di esso. ad esempio:

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

Tuttavia, poiché la password è vuota, ho bisogno di passare gli errori a FrontApp da BackApp. Questo non sta succedendo. Io proprio non capisco come farlo con successo. Questo deve essere uno scenario di integrazione comune; ma non sembra esserci una buona documentazione per questo?

mio controller di riposante che agisce come un proxy è il seguente:

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 

Che cosa è che mi manca? Qualsiasi aiuto sarà molto apprezzato.

Acclamazioni

risposta

13

dal codice sorgente di rotaie ho capito che il motivo ActiveResource non ha ottenuto gli errori era perché non ero assegnando errori di tag "errori" in JSON. Non è documentato ma richiesto. :)

Quindi il mio codice avrebbe dovuto essere:

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

'format.json {render: json => {: errors => @ customer.errors},: status =>: unprocessable_entity}' ----> Funzionerà ..... Ho anche avuto lo stesso problema perché stavo usando il codice come @ customer.errors.full_messages, non sta assegnando e restituendo l'applicazione della risorsa attiva –

1

Nel codice:

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 

provare a sostituire

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

con

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

tuo modello attivo di risorse passare i params come l'hash sopra :

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

Grazie per il suggerimento, ma contribuirebbe in ogni modo a risolvere il problema che sto affrontando? – Priyank

+0

Questo è l'unico errore nel codice. Ho pensato che forse quell'errore non stava facendo sì che la modella realizzasse gli errori. Se questo non aiuta, mi dispiace ma non so cos'altro provare. – robertokl

1

Questa soluzione ha funzionato per me: https://stackoverflow.com/a/10051362/311744

azione di aggiornamento:

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 

controllo di chiamata:

@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