#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 } )