Перенаправление на страницу 500 при сбое вызова AJAX в Ruby on Rails - PullRequest
6 голосов
/ 06 марта 2009

Я сейчас работаю с приложением, созданным в Ruby on Rails, с очень плохой обработкой ошибок. Если метод контроллера выполняется через ajax, и этот метод приводит к 500 (или 404 или любому другому ответу), то страница 500.html отображается и возвращается как результат запроса AJAX. Очевидно, что javascript не знает, что делать с этим HTML, и веб-страница выглядит так, будто просто ждет ответа.

Есть ли в rails простой способ рендерить шаблон error.rjs каждый раз, когда возникает ошибка во время вызова AJAX?

Ответы [ 4 ]

3 голосов
/ 07 марта 2009

Я решил похожую проблему с авторизацией. Я создал простой контроллер авторизации с этим действием:

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

Вот шаблон:

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

Когда авторизация не удалась в контроллере, я бы перенаправил на: controller => "authorization",: action => "unauthorizedxhr" после установки значения flash [: note]. Это позволило мне настроить сообщение, которое я отправил пользователю, и обработало отображение сообщения с помощью рендера: код обновления выше.

Вы можете адаптировать это к вашей проблеме, создав контроллер ошибок, перехватывая любые возникшие ошибки в других ваших контроллерах, а затем просто перенаправляя на: controller => "errors",: action => "displayxhr", когда вызов не удается. Таким образом, вы стандартизировали свой механизм сообщения об ошибках, но позволили себе настраивать сообщения об ошибках при каждом действии.

Вы все еще можете использовать идею cpm выше, но отображение ошибки будет обрабатываться отдельной и отличной логикой контроллера. это должно облегчить обслуживание.

Надеюсь, это поможет. -Крис

3 голосов
/ 07 марта 2009

Вы можете использовать response_to внутри метода rescue_action или rescue_action_in_public контроллера. Рассмотрим следующий контроллер:

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
1 голос
/ 20 марта 2009

Это было мое окончательное решение:

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

Это в основном перенаправляет на правильную статическую HTML-страницу, независимо от того, был ли запрос через AJAX или обычный GET / POST.

Это НЕ используется для обычной обработки ошибок, таких как проверка и т. Д. Он используется только тогда, когда происходит что-то действительно плохое - как необработанное исключение.

0 голосов
/ 18 ноября 2011

Вы можете сделать, как показано ниже:

в allpication.js

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

Это работает для меня .....

...