【问题标题】:Why does '/' match correctly to a Rack application in my Rails 3 app, but no other route does?为什么 '/' 与我的 Rails 3 应用程序中的 Rack 应用程序正确匹配,但没有其他路由匹配?
【发布时间】:2011-04-12 07:55:51
【问题描述】:

我使用的是 Rails 3.0.6。

在我的 lib 目录中,我有一个 example_app.rb,它只是一个 Sinatra 应用程序:

class ExampleApp < Sinatra::Base
  get '/' do
    "Hello from Sinatra"
  end
end

我正在使用 application.rb config.auto_load_paths 配置自动加载它。

在我的路线文件中,我只有:

match "/" => ExampleApp

当我运行 rails 服务器 (Webrick) 时,这匹配得很好。但是,如果我尝试:

match "/example" => ExampleApp

访问 localhost:3000/example 会给我一个“没有路由匹配“/example””错误。运行 rake routes 会显示路线:

example  /example(.:format) {:to=>ExampleApp}

如果我尝试将“/example”与控制器操作匹配,它可以正常工作,但不能与上面的 Sinatra 应用程序匹配,所以我不确定发生了什么。我知道在 Rails 站点上的路由文档中找不到我遗漏的一些小东西。

感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails ruby routing


    【解决方案1】:

    问题在于您的 Sinatra 应用程序仅响应对 / 的请求。您需要添加

    get '/example'
    

    或使用*进行通配符匹配

    get '*' do
      "Hello from Sinatra"
    end
    

    【讨论】:

    • 如果我将 Sinatra 路由更改为匹配的“/example”,我仍然会收到“无路由匹配”错误。此外,这似乎与我在 yehudakatz.com/2009/12/26/the-rails-3-router-rack-it-up 阅读的博客文章冲突,其中在 Rails 3 路由中用作示例的“/home”应该与仅使用“/”路由的 Sinatra 应用程序匹配。
    • 我刚刚创建了一个新应用并尝试了这个。 Yehuda 的示例似乎不起作用(可能是他的错误),但是当我做match '/example', :to =&gt; MyAppMyApp 中的get '/example' 时,我得到了有效的回复。你能确保你做对了吗?我使用 Rails 3.0.6 和 Sinatra 1.2.2 进行了测试。
    • 好的,在我创建了另一个应用程序之后,我现在可以使用您的示例来使用它。可能就像我需要用我原来的例子重新启动 Webrick 一样简单,我的错。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 2019-05-19
    • 2013-05-27
    • 2013-10-26
    • 2022-12-05
    • 2010-11-24
    相关资源
    最近更新 更多