所以我在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)
但是rails抱怨:"未定义的局部变量或方法`current_user' for ApplicationController:Class"
那么如何访问实例变量,因为代码不在块中?
我也尝试将它包装在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
端
但应用程序无法在服务器上运行。
答案 0 :(得分: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
答案 1 :(得分:0)
如果您还没有找到解决方案,可以试试这个技巧:
unless Rails.application.config.consider_all_requests_local || (Thread.current[:user].present? && Thread.current[:user].site_amdin)
我同意这种方法有一些缺点,但是当其他可能性耗尽时,值得尝试。