5

Это мой первый пост здесь, поэтому я надеюсь, что я разместил этот вопрос в нужном месте. В противном случае, пожалуйста, дайте мне знать, чтобы я знал, что буду в следующий раз размещать здесь :)Ruby on Rails -HTTP обработка ошибок

Я работаю на веб-сайте RoR и хотел бы обрабатывать ошибки сервера (400, 404, 500 и т. Д.) Отдельно. Кроме того, поскольку сайт является динамическим, я хотел бы обрабатывать ошибки в среде рельсов, а не на уровне сервера. Пример того, что я хотел бы сделать, может состоять в том, чтобы представить пользователю дополнительный материал или панель поиска, когда она попадает на страницу или шаблон, который не загружается или просто не существует.

Я новичок в RoR, поэтому, пожалуйста, приготовьтесь со мной на случай, если я задам очевидное.

Итак, я немного читал, и я думаю, что использование обработчика исключений rescue_from - это способ пойти в моем случае. (Было бы более чем приятно услышать, если у кого-то из вас есть другое мнение).

У меня есть простой рабочий прототип (см код ниже) и работает, однако, я получаю сообщение об ошибке, когда я включаю следующий обработчик исключений в коде:

rescue_from ActionController::MissingTemplate,   :with => :not_found #404 

Теперь, я не могу видеть что у меня есть орфографическая ошибка, и я видел эту строку в коде, опубликованном в Интернете. Однако, когда я включаю его, я получаю следующую ошибку маршрутизации:

Routing Error No route matches "/errorhandle" with {:method=>:get} 

Я работаю на рельсах 2.3.5, возможно, что что-то делать с этим?

Я надеюсь, что вы можете помочь мне пролить свет на этот вопрос.

Cheers! /Maja

class ApplicationController < ActionController::Base 

    helper :all # include all helpers, all the time 

    protect_from_forgery #See ActionController::RequestForgeryProtection for details 

    #ActiveRecord exceptions 
    rescue_from ActiveRecord::RecordNotFound, :with => :not_found #400 

    #ActiveResource exceptions 
    rescue_from ActiveResource::ResourceNotFound, :with => :not_found #404 

    #ActionView exceptions 
    rescue_from ActionView::TemplateError, :with => :not_found #500 

    #ActionController exceptions 
    rescue_from ActionController::RoutingError, :with => :not_found #404 

    rescue_from ActionController::UnknownController, :with => :not_found #404 

    rescue_from ActionController::MethodNotAllowed, :with => :not_found #405 

    rescue_from ActionController::InvalidAuthenticityToken, :with => :not_found #405 

    rescue_from ActionController::UnknownAction, :with => :not_found #501 

    # This particular exception causes all the rest to fail.... why? 
    # rescue_from ActionController::MissingTemplate, :with => :not_found #404 

    protected 
    def not_found 
     render :text => "Error", :status => 404 
    end 

    # Scrub sensitive parameters from your log 
    # filter_parameter_logging :password 
end 
+1

Можете ли вы показать нам соответствующие маршруты с маршрутов.rb, если таковые имеются? – Trevoke

+0

Sure Trevoke, спасибо за быстрый ответ. Я ничего не добавил к route.rb, так что я думаю, что это в значительной степени std. файл: ActionController :: Routing :: Routes.draw do | map | map.resources: errorhandlers # ... # участки линий закомментированы # ... map.connect ': контроллер /: Действие /: идентификатор' map.connect «: контроллер /: Действие/: id.: format ' end – 2010-01-14 15:08:10

+0

Ух, не уверен, как сделать комментарий красивым и аккуратным * uark *. Надеюсь, что это так легко читать ... – 2010-01-14 15:10:04

ответ

2

Возьмите быстрый взгляд на них: http://www.ruby-forum.com/topic/47898

http://henrik.nyh.se/2008/09/404-invalid-rails-format

В частности, пост в первой ссылке:

You can't use a regular 'rescue' keyword to rescue MissingTemplate exception.

Use rescue_action instead, for example:

def rescue_action(exception) 
    if ::ActionController::MissingTemplate === exception 
    render :text => 'rescued' 
    else 
    super 
    end 
end 

Kent.

+0

Большое спасибо Кенту за ваш ответ и ссылки, они были очень полезны.Я прочитаю об обработке :: и общей обработке исключений в RoR, чтобы лучше понять ваш ответ. ... а потом я мог бы бросить еще несколько вопросов, если вы не возражаете? На данный момент - благодаря всем вам, это замечательно быть частью такого активного форума! /Maja – 2010-01-14 16:06:40

+0

I'm not Kent - Кент - тот, кто ответил на этот вопрос в первой ссылке :-) Добро пожаловать. Во что бы то ни стало, задайте больше вопросов, вот для чего этот сайт! (конечно, сначала прочитайте документ, конечно). – Trevoke