Как работает rescue_action в Rails3?

#ruby #ruby-on-rails-3

#ruby #ruby-on-rails-3

Вопрос:

Я хотел бы реализовать это

 class SecurityTransgression < StandardError; end

 def create
   raise SecurityTransgression unless ...
 end

class ApplicationController < ActionController::Base
  def rescue_action(e)
  case e
    when SecurityTransgression
      head :forbidden
    end
  end
end
  

из этого поста в блоге.

Проблема в том, что это не работает. Я вижу не запрещенную страницу, а стандартную страницу ошибки Rails «Нарушение безопасности в MyController #action». Я выяснил, что некоторые методы rescue_action работают только в производственном режиме. Я попробовал это, и это то же самое. Изменений нет.

Мой вопрос: есть ли какая-нибудь хорошая документация по методу rescue_action (и другим)? Работает ли это в Rails 3.0? Потому что кажется, что это какой-то старый

Ответ №1:

Взгляните на rescue_from в документации API.

Комментарии:

1. Заменяет ли rescue_from rescue_action в Rails3 rescue_action?

2. Rescue_from — это путь в Rails3, да.

Ответ №2:

Метод rescue_action обычно вызывается внутренне с помощью хэша @_env, передаваемого в качестве параметра. Метод ожидает, что экземпляр исключения будет существовать в ключе «action_dispatch.rescue.exception».

Если вам необходимо напрямую использовать метод rescue_action, вы можете сделать следующее:-

 @_env[ "action_dispatch.rescue.exception" ] = exception
rescue_action( @_env )
  

или еще проще:-

 rescue_action( { "action_dispatch.rescue.exception" => exception } )