访问rescue_from block

时间:2015-11-04 21:01:02

标签: ruby-on-rails ruby

所以我在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

但应用程序无法在服务器上运行。

2 个答案:

答案 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)

我同意这种方法有一些缺点,但是当其他可能性耗尽时,值得尝试。