Подтвердить что ты не робот

ExceptionNotifier и rescue_from

Я пытаюсь реализовать exception_notifier и настраиваемую обработку исключений в моих рельсах 3 приложения. Когда я использую только исключение извещения, все работает нормально. В режиме разработки с

config.consider_all_requests_local = false

и rescue_from в моем приложении_controller:

unless Rails.application.config.consider_all_requests_local
  rescue_from Exception, :with => :render_error
end

def render_error(exception)
  ExceptionNotifier::Notifier.exception_notification(request.env, exception).deliver
end

в моем приложении .rb

config.middleware.use ExceptionNotifier,
  :email_prefix => "Error: ",
  :sender_address => %{"notifier" <[email protected]>},
  :exception_recipients => %w{ [email protected] }

Единственная проблема заключается в том, что параметры не загружаются в request.env. Я попробовал файл в дополнительном инициализаторе, и я не знаю, что еще - он не работает. На данный момент у меня очень уродливый взлом, где я объединять request.env с хэш перед доставкой электронной почты.. Любая идея?

4b9b3361

Ответ 1

exception_notification является промежуточным программным обеспечением в Rails 3, поэтому параметры устанавливаются непосредственно в классе, который обрабатывает вызов, и этот класс не устанавливает их в среде, если он не принимает исключение (см. здесь). Эта вилка добавляет метод background_exception_notification, который вы можете использовать. Я заимствовал эту идею и просто добавил этот вспомогательный метод:

def background_exception_notification(env, exception)
  if notifier = Rails.application.config.middleware.detect { |x| x.klass == ExceptionNotifier }
    env['exception_notifier.options'] = notifier.args.first || {}                   
    ExceptionNotifier::Notifier.exception_notification(env, exception).deliver
    env['exception_notifier.delivered'] = true
  end
end