2009-03-06 8 views
6

Estoy trabajando con una aplicación creada en Ruby on Rails con un mal manejo de errores en este momento. Si un método de controlador se ejecuta a través de ajax, y ese método da como resultado un 500 (o 404 o cualquier otra respuesta), la página 500.html se representa y se devuelve como resultado de la solicitud de AJAX. Obviamente, el javascript no sabe qué hacer con ese HTML y la página web parece que está esperando una respuesta.Redireccionando a una página de 500 cuando falla una llamada AJAX en Ruby on Rails

¿Existe alguna manera fácil en los rieles para representar una plantilla error.rjs cada vez que se produce un error durante una llamada AJAX?

Respuesta

3

Puede usar responder_ dentro de un controlador rescue_action o rescue_action_in_public method. Tenga en cuenta el siguiente controlador:

class DefaultController < ApplicationController 

    def index 
    raise "FAIL" 
    end 

    def rescue_action(exception) 
    respond_to do |format| 
     format.html { render :text => "Rescued HTML" } 
     format.js { render :action => "errors" } 
    end 
    end 
end 
3

Resolví un problema similar con la autorización. He creado un controlador simple autorización con esta acción:

def unauthorizedxhr 
    render :update do |page| 
     page.replace_html("notice", :partial=>"unauthorizedxhr") 
     page.show("notice")  
    end 
    end 

Aquí está la plantilla:

<% if flash[:notice] -%> 
    <div id="noticexhr"><%= flash[:notice] %></div> 
<% end -%> 

Cuando la autorización falló en el controlador, me vuelven a dirigir al: Controlador => "autorización", : action => "desautorizedxhr" después de configurar el valor de flash [: notice]. Esto me permitió personalizar el mensaje que envié al usuario, y manejó la visualización del mensaje a través del render: código de actualización anterior.

Puede adaptar esto a su problema creando un controlador de errores, detectando cualquier error elevado en sus otros controladores, simplemente redireccionando a: controller => "errors",: action => "displayxhr" cuando falla la llamada. De esta forma, habrá estandarizado su mecanismo de comunicación de error pero se ha permitido personalizar los mensajes de error en cada acción.

Aún puede utilizar la idea de cpm anterior, pero la visualización del error se manejará mediante una lógica de controlador separada y distinta. eso debería hacer que sea un poco más fácil de mantener.

Espero que ayude. -Chris

1

Esta fue mi solución final:

def rescue_action_in_public(exception) 
    response_code = response_code_for_rescue(exception) 
    status = interpret_status(response_code) 
    respond_to do |format| 
    format.html { render_optional_error_file response_code} 
    format.js { render :update, :status => status do |page| page.redirect_to(:url => error_page_url(status)) end} 
    end 
end 

Esto básicamente hacia delante a la página HTML estática correcta sin importar si la solicitud fue a través de AJAX o conseguir la normalidad/POST.

Esto NO se usa para el manejo normal de errores como la validación, etc. Solo se usa cuando sucede algo realmente malo, como una excepción no controlada.

0

Se puede hacer, como a continuación:

en allpication.js

$(document).ready(function(){ 
    $(document).ajaxError(function(e, xhr, options){ 
    if("500" == xhr.status) 
    { 
     $(location).attr('href','/users/sign_in'); 
    } 
    }); 
}) 

Su trabajo para mí .....

Cuestiones relacionadas