是否使用Rails 3引擎打破了默认路由?

时间:2010-09-23 14:40:10

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

我有一个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的命令行中,我设置了以下env变量

RAILS_RELATIVE_URL_ROOT="/my_app"

和config.ru

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

对于我在Rails 3.1中

root :to => 'ControllerName#Action'

工作正常。