2015-11-04 92 views
1

所以我有一個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中:類」

所以,我怎麼能訪問實例變量,罪代碼不在一個塊內?

我也試圖把它包在的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

爲此嘗試「引發異常」。 – Inpego

0

如果你暫時還沒有發現一個解決方案,你可以試試這招:

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

我同意這種做法有但是,你可以從一個被稱爲與方法訪問它們有些缺點,但在其他可能性耗盡時值得嘗試。