【问题标题】:Rescuing LoadError in Rails application在 Rails 应用程序中抢救 LoadError
【发布时间】:2015-09-20 09:02:20
【问题描述】:

在我的 Rails 3 应用程序中,我通过以下方式获取 path_info:

Rails.application.routes.recognize_path(url, { :method => request.request_method }) rescue {}

如果爬虫点击“http://localhost:3000/admin_”之类的 URL,上面的代码会引发以下错误:

LoadError: Expected /Users/user/myRailsApp/app/controllers/admin_controller.rb to define Admin_Controller
from /Users/user/.rvm/gems/ree-1.8.7-2012.02/gems/activesupport-3.0.20/lib/active_support/dependencies.rb:492:in `load_missing_constant'

我有两个问题:

  1. 为什么rescue 不起作用?如果我把它改成rescue LoadError => e,异常会被优雅地处理。
  2. 除了挽救此类异常之外,还有其他选择吗?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-1.8.7


    【解决方案1】:

    如果您省略异常类型,默认情况下rescue 将仅拯救StandardError 异常和子类。

    LoadError 不继承自 StandardError:

    LoadError.ancestors
     => [LoadError, ScriptError, Exception, Object, Kernel, BasicObject]
    

    因此,单行救援模式不适用于LoadError。

    【讨论】:

    • 谢谢。它回答了第一个问题。第二个呢?是否有其他方法可以处理此类 URL?
    • 我不明白你为什么用这种方式获取路径信息而不是使用request.env['PATH_INFO']
    • Rails.application.routes.recognize_path 给了我一个以controller 和action 作为键的哈希。我需要这个哈希来做一些进一步的处理。这甚至适用于自定义路线。 request.env['PATH_INFO'] 不给我那个。
    • 在控制器中可以访问controller_name和action_namestackoverflow.com/questions/21399663/…
    • 我必须在 lib 文件中获取 path_info 才能使其正常工作:github.com/bendiken/rack-throttle/blob/master/lib/rack/throttle/…。因此不能在控制器中使用path_info。如果您需要更多详细信息,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2012-05-13
    相关资源
    最近更新 更多