Ruby on rails 3 Rails 3嵌套资源短名称?

Ruby on rails 3 Rails 3嵌套资源短名称?,ruby-on-rails-3,routes,helpers,Ruby On Rails 3,Routes,Helpers,我正在将Rails 2.3应用程序升级到Rails 3。在Rails 2.3路由器中,可以将嵌套资源上的:name\u前缀设置为nil,以获得较短的名称。实际的URL仍然是完全限定的,但代码可以使用较短的名称。例如: map.resources :sites do |site| site.resources :groups, :as => :groups, :controller => :url_groups, :name_prefix => nil, :member => { :clo

我正在将Rails 2.3应用程序升级到Rails 3。在Rails 2.3路由器中,可以将嵌套资源上的
:name\u前缀设置为nil,以获得较短的名称。实际的URL仍然是完全限定的,但代码可以使用较短的名称。例如:

map.resources :sites do |site| site.resources :groups, :as => :groups, :controller => :url_groups, :name_prefix => nil, :member => { :clone => :post } do |group| group.resources :tests, :as => :tests, :controller => :test_runs, :name_prefix => nil, :collection => { :latest => :get } end end map.resources:sites do | site| site.resources:groups,:as=>:groups,:controller=>:url\u groups,:name\u prefix=>nil,:member=>{:clone=>:post}do | group| group.resources:tests,:as=>:tests,:controller=>:test\u runs,:name\u prefix=>nil,:collection=>{:latest=>:get} 结束 结束
将允许使用
最新的测试路径
。我不知道如何在Rails 3上做同样的事情,所以我只能使用
最新的站点\组\测试\路径
。如果这是它需要的方式,我可以遍历代码并更改它的每个实例。但我想先确保我没有错过任何东西。不管是好是坏,我确实需要维护URL结构,因此浅路由似乎不是答案。

:浅路由选项(请参阅),但我不确定它是否适合您的用例:

resources :sites, :shallow => true
  resources :groups do
    resources :tests
  end
end
它的缺点是创建了一组额外的路由:

   group_tests GET    /groups/:group_id/tests(.:format)        {:action=>"index", :controller=>"tests"}
               POST   /groups/:group_id/tests(.:format)        {:action=>"create", :controller=>"tests"}
new_group_test GET    /groups/:group_id/tests/creer(.:format)  {:action=>"new", :controller=>"tests"}
     edit_test GET    /tests/:id/modifier(.:format)            {:action=>"edit", :controller=>"tests"}
          test GET    /tests/:id(.:format)                     {:action=>"show", :controller=>"tests"}
               PUT    /tests/:id(.:format)                     {:action=>"update", :controller=>"tests"}
               DELETE /tests/:id(.:format)                     {:action=>"destroy", :controller=>"tests"}
   site_groups GET    /sites/:site_id/groups(.:format)         {:action=>"index", :controller=>"groups"}
               POST   /sites/:site_id/groups(.:format)         {:action=>"create", :controller=>"groups"}
new_site_group GET    /sites/:site_id/groups/creer(.:format)   {:action=>"new", :controller=>"groups"}
    edit_group GET    /groups/:id/modifier(.:format)           {:action=>"edit", :controller=>"groups"}
         group GET    /groups/:id(.:format)                    {:action=>"show", :controller=>"groups"}
               PUT    /groups/:id(.:format)                    {:action=>"update", :controller=>"groups"}
               DELETE /groups/:id(.:format)                    {:action=>"destroy", :controller=>"groups"}
         sites GET    /sites(.:format)                         {:action=>"index", :controller=>"sites"}
               POST   /sites(.:format)                         {:action=>"create", :controller=>"sites"}
      new_site GET    /sites/creer(.:format)                   {:action=>"new", :controller=>"sites"}
     edit_site GET    /sites/:id/modifier(.:format)            {:action=>"edit", :controller=>"sites"}
          site GET    /sites/:id(.:format)                     {:action=>"show", :controller=>"sites"}
               PUT    /sites/:id(.:format)                     {:action=>"update", :controller=>"sites"}
               DELETE /sites/:id(.:format)                     {:action=>"destroy", :controller=>"sites"}

此外,浅嵌套仅适用于以下路径:
:show、:edit、:update、:destroy

好消息是Rails 3仍然能够设置任意/缩写的url帮助程序。您可以使用routes.rb中的
match
声明创建快捷url帮助程序,而不是resources方法的参数

假设我们有这样的路由设置(注意您需要保持3个嵌套级别):

我们获得了所有标准url帮助程序(
rake routes
):

但要创建比最新站点、组、测试运行路径(站点、组)
更短的内容,请向routes.rb添加匹配声明,如下所示:

match 'sites/:site_id/groups/:id/test_runs/latest' => 'test_runs#latest', :as => :latest_tests
现在,您可以使用最新的测试路径(站点、组)或最新的测试url(站点、组)来生成完全嵌套的路径

如果您的目标是简洁,那么还可以使用隐式多态路径(只要您的所有模型都与资源路径对齐)

例如,给定@site#1和@group#1,下面所有内容现在将生成相同的路径
'/sites/1/groups/1/test#runs/latest'

= link_to "latest tests", latest_site_group_test_runs_path(@site,@group) # std helper
= link_to "latest tests", latest_tests_path(@site,@group) # match helper
= link_to "latest tests", [:latest,@site,@group,:test_runs] # implicit polymorphic path
希望有帮助!看起来您应该能够获得应用程序迁移所需的灵活性


注:我掩盖了一个潜在的问题,即拥有一个名为“测试”的模型,因为这是离题的;-)由于名称空间和关键字冲突,有一些模型名永远是痛苦的根源。我的另一个最爱是,当我真的想要一个名为“Case”的模式时(因为它与问题域最匹配。坏主意,快速反转!)

我也想要这样的模式,显然,对于仅以嵌套形式存在的资源,总是在命名路由中键入前缀是多余的。我能够使用
scope
获得我想要的,我想这也是您所寻求的:

资源:站点
作用域:path=>'/sites/:site_id'do
资源:组,:controller=>:url\u组做什么
post:clone,:on=>:member
结束
结束
作用域:path=>'/sites/:site_id/groups/:group_id'do
资源:测试,:控制器=>:测试运行
获取:最新,:on=>:集合
结束
结束
rake路由
输出:

站点获取/站点(:格式)站点#索引
发布/站点(:格式)站点#创建
新建站点获取/站点/新建(:格式)站点#新建
编辑_siteget/sites/:id/edit(:format)sites#编辑
站点获取/站点/:id(:格式)站点#显示
PUT/sites/:id(:format)sites#update
删除/站点/:id(:格式)站点#销毁
clone_group POST/sites/:site_id/groups/:id/clone(:format)url_groups#clone
groups GET/sites/:site_id/groups(:format)url_groups#index
POST/sites/:site_id/groups(:format)url_groups#create
新建_group GET/sites/:站点_id/groups/new(:format)url_group#new
编辑_group GET/sites/:site_id/groups/:id/edit(:format)url_groups#edit
组GET/sites/:site_id/groups/:id(:format)url_groups#show
PUT/sites/:site_id/groups/:id(:format)url_groups#update
删除/sites/:site_id/groups/:id(:format)url_groups#销毁
最新测试获取/站点/:站点id/组/:组id/测试/最新(:格式)测试运行#最新
测试获取/sites/:site_id/组/:group_id/测试(:format)测试运行#索引
POST/sites/:站点id/组/:组id/测试(:格式)测试运行#创建
新建测试获取/站点/:站点id/组/:组id/测试/新建(:格式)测试运行#新建
编辑测试获取/站点/:站点id/组/:组id/测试/:id/编辑(:格式)测试运行#编辑
测试获取/sites/:site_id/groups/:group_id/tests/:id(:format)测试运行#显示
PUT/sites/:site_id/groups/:group_id/tests/:id(:format)test_runs#update
删除/sites/:site_id/groups/:group_id/tests/:id(:format)测试运行#销毁

更新:嗯,我把作用域路径的静态段排除在示例之外。已修复。

谢谢。浅名称的另一个问题是,较短的路由名称会生成不同的URL结构
match 'sites/:site_id/groups/:id/test_runs/latest' => 'test_runs#latest', :as => :latest_tests
= link_to "latest tests", latest_site_group_test_runs_path(@site,@group) # std helper
= link_to "latest tests", latest_tests_path(@site,@group) # match helper
= link_to "latest tests", [:latest,@site,@group,:test_runs] # implicit polymorphic path