我有一个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
答案 0 :(得分:2)
我在制作宝石时遇到了同样的事情。在应用程序路由后加载引擎路由,我认为这可能是您的问题。看一下rake routes
而无需为用户点击。我怀疑您的应用程序中有一条优先于用户路由的路由。如果您的应用程序路由中有match '/:controller(/:action(/:id))'
,那么这将优先于gem用户路由。可能会解释为什么/ users / show / 137有效,而不是RESTful路由。可以在引擎初始化程序中加载路由,使其优先于应用程序路由。发布完整的rake routes
结果,这可能有助于我们找到解决方案。
答案 1 :(得分:0)
对于我在Rails 3.1中
root :to => 'ControllerName#Action'
工作正常。