10

He estado buscando por un tiempo y todavía no he podido encontrar una respuesta satisfactoria. Tengo dos aplicaciones. FrontApp y BackApp. FrontApp tiene un recurso activo que imita un modelo en BackApp. Todas las validaciones de nivel de modelo viven en BackApp y necesito manejar esas validaciones de BackApp en FrontApp.Manejo de errores de ActiveResource

He siguiente código-recurso activo:

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

Esto imita un modelo que es el siguiente

class User < ActiveRecord::Base 

    attr_accessor :username, :password 

    validates_presence_of :username 
    validates_presence_of :password 
end 

Cada vez que se crea un nuevo RemoteUser en aplicación frontal; Llamo .save en eso. por ejemplo:

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

Sin embargo, ya que la contraseña está en blanco, tengo que pasar de nuevo los errores a FrontApp de BackApp. Esto no está ocurriendo. Simplemente no entiendo cómo hacerlo con éxito. Este debe ser un escenario de integración común; pero parece que no hay una buena documentación para eso?

Mi controlador reparador que actúa como un proxy es el siguiente:

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é es lo que me falta? Cualquier ayuda será muy apreciada.

Saludos

Respuesta

13

desde el código fuente rieles me di cuenta de que la razón ActiveResource no tuvo errores era porque no estaba asignando a errores etiqueta de "errores" en JSON. No está documentado pero es obligatorio. :)

Así que mi código debería haber sido:

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

'format.json {render: json => {: errors => @ customer.errors},: status =>: unprocessable_entity}' ----> Esto funcionará ... También tuve el mismo problema porque Estaba usando el código como @ customer.errors.full_messages, no está asignando y devolviendo la aplicación del recurso activo –

1

En el código:

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 

tratar de sustituir

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

con

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

Su modelo de recurso activo pasar los parametros como el hash anterior :

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

Gracias por la propina, pero ¿Eso contribuiría de todos modos para resolver el problema que estoy enfrentando? – Priyank

+0

Ese parece ser el único error en su código. Pensé que tal vez ese error no estaba haciendo que el modelo cumpliera los errores. Si eso no ayuda, lo siento pero no sé qué más probar. – robertokl

1

Esta solución funcionó para mí: https://stackoverflow.com/a/10051362/311744

acción de actualización:

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 

Calling controlador:

@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