【问题标题】:Rails 3.1rc4 + Rack: has something changed?Rails 3.1rc4 + Rack:有什么变化吗?
【发布时间】:2023-11-06 14:09:02
【问题描述】:

我似乎无法在 Rails 3.1 (rc4) 中使用简单的机架中间件。有什么遗漏吗?以下是我构建应用的方式:

$ rails new skel192 -G -O -T

我在Gemfile的末尾添加了这一行:

gem 'rack-contrib'

我将这些行添加到config/application.rb:

require 'rack/contrib'
...
config.middleware.use Rack::NotFound.new('public/404.html')

[注意:我真的不打算使用RackNotFound,我正在尝试使用我能想到的最简单的中间件。]

那么好衡量:

$ bundle install
...
$ bundle update
...

仅供参考:

$ ruby -v
ruby 1.9.2p290 (2011-07-09) [i386-mingw32]
$ rails -v
Rails 3.1.0.rc4

但是当我跑步时:

$ rails server
=> Booting WEBrick
=> Rails 3.1.0.rc4 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
Exiting
C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/inflector/methods.rb:124:in `const_defined?': wrong constant name #<Rack (NameError)
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/inflector/methods.rb:124:in `block in constantize'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/inflector/methods.rb:123:in `each'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/inflector/methods.rb:123:in `constantize'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/dependencies.rb:527:in `block in initialize'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/dependencies.rb:549:in `yield'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/dependencies.rb:549:in `default'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/activesupport-3.1.0.rc4/lib/active_support/dependencies.rb:549:in `[]'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/actionpack-3.1.0.rc4/lib/action_dispatch/middleware/stack.rb:24:in `klass'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/actionpack-3.1.0.rc4/lib/action_dispatch/middleware/stack.rb:43:in `build'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/actionpack-3.1.0.rc4/lib/action_dispatch/middleware/stack.rb:112:in `block in build'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/actionpack-3.1.0.rc4/lib/action_dispatch/middleware/stack.rb:112:in `each'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/actionpack-3.1.0.rc4/lib/action_dispatch/middleware/stack.rb:112:in `inject'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/actionpack-3.1.0.rc4/lib/action_dispatch/middleware/stack.rb:112:in `build'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/engine.rb:429:in `app'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/application/finisher.rb:37:in `block in <module:Finisher>'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/initializable.rb:25:in `instance_exec'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/initializable.rb:25:in `run'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/initializable.rb:50:in `block in run_initializers'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/initializable.rb:49:in `each'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/initializable.rb:49:in `run_initializers'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/application.rb:96:in `initialize!'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/railtie/configurable.rb:30:in `method_missing'
        from C:/work/tech/external/lb/skel192/config/environment.rb:5:in `<top (required)>'
        from C:/work/tech/external/lb/skel192/config.ru:4:in `require'
        from C:/work/tech/external/lb/skel192/config.ru:4:in `block in <main>'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.3.1/lib/rack/builder.rb:51:in `instance_eval'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.3.1/lib/rack/builder.rb:51:in `initialize'
        from C:/work/tech/external/lb/skel192/config.ru:1:in `new'
        from C:/work/tech/external/lb/skel192/config.ru:1:in `<main>'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.3.1/lib/rack/builder.rb:40:in `eval'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.3.1/lib/rack/builder.rb:40:in `parse_file'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.3.1/lib/rack/server.rb:200:in `app'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/commands/server.rb:46:in `app'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.3.1/lib/rack/server.rb:301:in `wrapped_app'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rack-1.3.1/lib/rack/server.rb:252:in `start'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/commands/server.rb:70:in `start'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/commands.rb:54:in `block in <top (required)>'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/commands.rb:49:in `tap'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/railties-3.1.0.rc4/lib/rails/commands.rb:49:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'

我错过了什么吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rack ruby-on-rails-3.1


    【解决方案1】:

    您需要创建Rack::NotFound 的实例,因此在application.rb 中您需要输入:

    config.middleware.use Rack::NotFound.new("/path/to/404.html")
    

    【讨论】:

    • 你是对的(赞成!)但它仍然对我不起作用。我正在更新我的问题以纳入您的建议。 Rack 似乎仍然存在一些问题。
    【解决方案2】:

    我不知道这是否是您问题的答案,但 Rails 不正式支持 Ruby 1.9.1,仅支持 1.8.7 和 1.9.2。

    编辑:查看路径后,您使用的是 1.9.1 还是 1.9.2? gem 似乎安装在 1.9.1

    【讨论】:

    • 我同时使用 Ruby 1.8.7 和 1.9.2。我在 Linux 上使用 rvm 在 Windows 上使用 pik 在 Ruby 之间切换。您在路径中看到的“1.9.1”正是 Ruby 1.9.2 命名事物的方式(不知道为什么)。如果你安装 1.9.2 你可以自己看看。
    • 当我将 rvm 与 gemset 一起使用时,我的 gem 路径中看不到 1.9.1。这个问题也发生在 Linux 上?根据您在下面的回答,您是否将 Rails 与 Sinatra 结合使用?
    • 我从未在任何平台上安装过 Ruby 1.9.1。我真的不知道为什么该名称出现在任何路径中,也许这是 Windows 特有的东西?是的,我的目标是让我的 Sinatra 中间件组件正常工作。但作为一个测试,我使用 Rails 3.1 和 Ruby 1.9.2 生成一个框架应用程序,我添加了一个 Rack::NotFound 中间件(没有 Sinatra)。我的问题是关于这个简单的设置。
    • 我更新了我的 Q(并重新运行了我的测试)以包含准确的 Ruby 和 Rails 版本。
    【解决方案3】:

    我仍然不确定为什么 Rack::NotFound 和其他 rack-contrib 中间件在 Rails 3.1 中失败,但我确实学到了其他东西:

    Sinatra 1.2.x does not play well with Rails 3.1。切换到 Sinatra 1.3.0.e 消除了我在使用自己的中间件时遇到的一些其他问题。

    安装:

    $ [sudo] gem install sinatra --prerelease
    

    然后更新你的中间件的依赖关系。

    【讨论】: