2009-03-06 11 views
6

Je travaille avec une application construite dans Ruby on Rails avec une très mauvaise gestion des erreurs en ce moment. Si une méthode de contrôleur est exécutée via ajax, et que cette méthode entraîne une réponse 500 (ou 404 ou toute autre réponse), la page 500.html est rendue et renvoyée comme résultat à la requête AJAX. De toute évidence, le javascript ne sait pas quoi faire avec ce code HTML et la page Web a l'air d'attendre une réponse.Rediriger vers une page de 500 lorsqu'un appel AJAX échoue dans Ruby on Rails

Existe-t-il un moyen facile dans les rails de générer un modèle error.rjs chaque fois qu'une erreur survient lors d'un appel AJAX?

Répondre

3

Vous pouvez utiliser respond_to dans la méthode rescue_action ou rescue_action_in_public d'un contrôleur. Considérez le contrôleur suivant:

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

J'ai résolu un problème similaire avec autorisation. J'ai créé un contrôleur d'autorisation simple avec cette action:

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

Voici le modèle:

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

Lorsque l'autorisation a échoué dans le contrôleur, je redirigent au: contrôleur => « autorisation », : action => "nonauthorizedxhr" après avoir réglé la valeur du flash [: notice]. Cela m'a permis de personnaliser le message que j'ai envoyé à l'utilisateur, et il a traité l'affichage du message à travers le rendu: code de mise à jour ci-dessus. Vous pouvez adapter cela à votre problème en créant un contrôleur d'erreurs, en détectant les erreurs surélevées dans vos autres contrôleurs, puis en redirigeant simplement vers: controller => "errors",: action => "displayxhr" lorsque l'appel échoue. De cette façon, vous aurez standardisé votre mécanisme de communication d'erreur mais vous aurez la possibilité de personnaliser les messages d'erreur à chaque action.

Vous pouvez toujours utiliser l'idée de cpm ci-dessus, mais l'affichage de l'erreur sera géré par une logique de contrôleur séparée et distincte. cela devrait le rendre un peu plus facile à maintenir.

Espérons que ça aide. -Chris

1

Ce fut ma solution finale:

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 

Cette essentiellement vers l'avant à la page HTML statique correcte, peu importe si la demande était par GET/POST AJAX ou normal.

Ceci n'est PAS utilisé pour la gestion normale des erreurs, comme la validation, etc. Il n'est utilisé que lorsque quelque chose de vraiment mauvais se produit - comme une exception non gérée.

0

Vous pouvez faire comme ci-dessous:

dans allpication.js

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

Son travail pour moi .....