Ruby on rails Rails 3引擎是否破坏了默认路由?
我有一个用于基本用户身份验证和授权的Rails3引擎gem。在该Gem中,Ruby on rails Rails 3引擎是否破坏了默认路由?,ruby-on-rails,ruby-on-rails-3,routes,Ruby On Rails,Ruby On Rails 3,Routes,我有一个用于基本用户身份验证和授权的Rails3引擎gem。在该Gem中,config/routes.rb定义了以下内容 resources :users match '/:controller(/:action(/:id))' 当我从需要此gem的应用程序执行rake路由时,我得到以下路由 rake routes|grep users users GET /users(.:format) {:controller=>"users", :action=&g
config/routes.rb
定义了以下内容
resources :users
match '/:controller(/:action(/:id))'
当我从需要此gem的应用程序执行rake路由时,我得到以下路由
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
我用我正在创作的宝石经历了同样的事情。引擎路径在应用路径之后加载,我认为这可能是您的问题。查看rake路由
,无需为用户刷新。我怀疑您的应用程序中存在优先于用户路由的路由。如果在应用程序路由中有匹配“/:controller(/:action(/:id))”
,那么这将优先于gem用户路由。也许可以解释为什么/users/show/137有效,而不是RESTful路由。可以在引擎初始值设定项中加载路由,使其优先于应用程序路由。在Rails 3.1中发布完整的rake routes
结果,这可能会帮助我们找到解决方案。
root:to=>“ControllerName#Action”
工作正常。谢谢。确实有你上面提到的那场比赛。但是假设我在routes.rb文件(Gem和App)中都有匹配项,那么如果我更改加载顺序,我将在我的App中断开路由,而不是断开Gem路由。如果所有应用程序路由都是资源,这不是问题。请注意default routes.rb是如何注释掉这一点的。。匹配“/:控制器(/:操作(/:id))”。我认为rails团队正试图让人们不再使用这种惯例。但是很多人可能仍然在使用它,所以如果你正在分发gem,这对你的用户来说可能是个问题。这是一件很棘手的事情。这里有一些讨论:对于我的gem,我有gem routes.rb中的资源,当我的应用程序使用一个将采用precedence的路由时,我只是将gem资源添加到我的应用程序路由中,就像你在问题中提到的那样。这不是一个理想的解决方案,但它可能比尝试黑客和猴子补丁更好,让一切都在创业板开箱即用。有望在即将发布的rails版本中解决这一问题