2015-11-04 3 views
1

Таким образом, у меня есть довольно общий блок rescue_from в приложении Rails:доступа к переменным в rescue_from блоке

if Rails.env.production? 
    unless Rails.application.config.consider_all_requests_local 
     rescue_from Exception, with: lambda { |exception| render_error 500, exception } 
     rescue_from Mongoid::Errors::DocumentNotFound, with: lambda { |exception| render_error 404, exception } 
    end 
    end 

, но я хочу, чтобы иметь возможность увидеть сообщение об ошибке, если я пользователь админ, так что я изменить «если» линия:

unless Rails.application.config.consider_all_requests_local || (current_user.present? && current_user.site_amdin) 

но рельсам жалуется: «неопределенную локальную переменную или метод` current_user»для ApplicationController: Класс»

Так как я могу получить доступ к переменным экземпляра, грех ce код не находится внутри блока?

Я также попытался обернуть его в блоке before_filter:

before_filter do 
if Rails.env.production? || (current_user.present? && current_user.site_admin) 
    unless Rails.application.config.consider_all_requests_local 
     Application.rescue_from Exception, with: lambda { |exception| render_error 500, exception } 
     Application.rescue_from Mongoid::Errors::DocumentNotFound, with: lambda { |exception| render_error 404, exception } 
    end 
end 

конец

но приложение не будет работать на сервере.

ответ

1

«rescue_from» - это метод уровня класса и не имеет доступа к переменным экземпляра. Тем не менее, вы можете получить доступ к ним из метода, который вызывается с использованием:

if Rails.env.production? 
    unless Rails.application.config.consider_all_requests_local 
    rescue_from Exception, with: :show_exception 
    rescue_from Mongoid::Errors::DocumentNotFound, with: lambda { |exception| render_error 404, exception } 
    end 
end 

# at the end of file 

protected 

def show_exception(exception) 
    if current_user.present? && current_user.site_admin 
    render text: ([exception.message] + exception.backtrace).join('<br />') # render error for admin 
    else 
    render_error 500, exception 
    end 
end 
+0

Несомненно, но, делая это, я обходите собственную ошибку, сообщая, что получаю, когда не прибегаю к rescue_from. Но я думаю, что могу просто воспроизвести этот формат, выведя сообщение об ошибке в шаблон. –

+0

Попробуйте 'raise exception' для этого. – Inpego

0

Если вы не нашли решение, то вы можете попробовать этот трюк:

unless Rails.application.config.consider_all_requests_local || (Thread.current[:user].present? && Thread.current[:user].site_amdin) 

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

Смежные вопросы