Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3引擎是否破坏了默认路由?_Ruby On Rails_Ruby On Rails 3_Routes - Fatal编程技术网

Ruby on rails Rails 3引擎是否破坏了默认路由?

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

我有一个用于基本用户身份验证和授权的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=>"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版本中解决这一问题