【问题标题】:Are default routes broken with Rails 3 engines?Rails 3 引擎是否破坏了默认路由?
【发布时间】:2010-09-23 14:40:10
【问题描述】:

我有一个用于基本用户身份验证和授权的 Rails 3 引擎 gem。在该 Gem 中,config/routes.rb 定义了以下内容

resources :users
match '/:controller(/:action(/:id))'

当我从需要此 gem 的应用程序中执行 rake routes 时,我得到以下路线

rake routes|grep users
users GET   /users(.:format)               {:controller=>"users", :action=>"index"}
users POST  /users(.:format)               {:controller=>"users", :action=>"create"}
new_user GET  /users/new(.:format)         {:controller=>"users", :action=>"new"}
edit_user GET  /users/:id/edit(.:format)   {:controller=>"users", :action=>"edit"}
user GET   /users/:id(.:format)            {:controller=>"users", :action=>"show"}
user PUT   /users/:id(.:format)            {:controller=>"users", :action=>"update"}
user DELETE /users/:id(.:format)           {:controller=>"users", :action=>"destroy"}

这是我所期望的。

但是,当我尝试通过浏览器访问以下路线时

/users/137
/users/137/edit

我在日志中收到以下错误

AbstractController::ActionNotFound (The action '137' could not be found for UsersController):
  actionpack (3.0.0) lib/abstract_controller/base.rb:114:in `process'
  actionpack (3.0.0) lib/abstract_controller/rendering.rb:40:in `process'
  ...

有趣的是以下路径确实有效

/users/show/137
/users/edit/137

此外,如果我将以下内容添加到需要 gem 的应用程序中的 routes.rb 文件中,则一切都会按预期工作。

resources :users

是我遗漏了什么还是这是一个错误?

请注意,当我启动我的应用程序时,我也在执行以下操作 在我启动 rails 时的命令行上,我设置了以下环境变量

RAILS_RELATIVE_URL_ROOT="/my_app"

在 config.ru 中

map '/my_app' do
  run MSEL::Application
end

【问题讨论】:

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


    【解决方案1】:

    我用我正在创造的宝石经历了同样的事情。引擎路由是在应用程序路由之后加载的,我认为这可能是您的问题。看看rake routes 而不用grep 用户。我怀疑您的应用程序中有一条优先于用户路由的路由。如果您的应用程序路由中有match '/:controller(/:action(/:id))',那么这将优先于 gem 用户路由。可能会解释为什么 /users/show/137 有效,而不是 RESTful 路由。可以在引擎初始化程序中加载您的路由以优先于应用程序路由。发布您的完整 rake routes 结果,这可能有助于我们找到解决方案。

    【讨论】:

    • 感谢牛仔编码。确实有你上面提到的那场比赛。但是假设我在两个 routes.rb 文件(Gem 和 App)中都有匹配项,那么如果我更改加载顺序,我将中断我的应用程序中的路由,而不是我的 Gem 路由被破坏。
    • 如果你所有的应用程序路由都是资源,这不是问题。注意默认的 routes.rb 是如何注释掉的.. match '/:controller(/:action(/:id))'。我认为 Rails 团队正试图让人们远离使用这种约定。但是很多人可能仍在使用它,所以如果您正在分发 gem,这对您的用户来说可能是个问题。制作它是一件棘手的事情。这里有一些讨论:rails.lighthouseapp.com/projects/8994/tickets/…
    • 对于我的 gem,我在 gem routes.rb 中有资源,当我的应用程序使用优先的路由时,我只需将 gem 资源添加到我的应用程序路由中,就像你在你的问题。这不是一个理想的解决方案,但它可能比尝试破解和猴子补丁以使一切都在开箱即用的 gem 中工作更好。希望这将在即将发布的 rails 版本中得到解决
    【解决方案2】:

    在 Rails 3.1 中对我来说

    root :to => 'ControllerName#Action'

    工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      相关资源
      最近更新 更多