Rails 3嵌套资源简称?

nir*_*rum 7 routes helpers ruby-on-rails-3

我正在将Rails 2.3应用程序升级到Rails 3.在Rails 2.3路由器中,可以:name_prefix在嵌套资源上设置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

允许一个人使用latest_tests_path.我无法弄清楚如何使用Rails 3做同样的事情,所以我坚持不懈latest_site_group_tests_path.如果这是它需要的方式,我可以通过代码并更改它的每个实例.但我想确保我先没有遗漏任何东西.无论好坏,我确实需要保持URL结构,所以浅路径似乎不是答案.

tar*_*ate 8

好消息是Rails 3仍然能够设置任意/缩写的url助手.您可以使用matchroutes.rb中的声明创建短手url助手,而不是资源方法的参数.

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

resources :sites do
  resources :groups, :controller => :url_groups do
    member do
      post :clone
    end
    resources :test_runs do
      collection do
        get :latest
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我们得到所有标准的url helpers(rake routes):

           clone_site_group POST   /sites/:site_id/groups/:id/clone(.:format)                    {:action=>"clone", :controller=>"url_groups"}
latest_site_group_test_runs GET    /sites/:site_id/groups/:group_id/test_runs/latest(.:format)   {:action=>"latest", :controller=>"test_runs"}
       site_group_test_runs GET    /sites/:site_id/groups/:group_id/test_runs(.:format)          {:action=>"index", :controller=>"test_runs"}
                           (etc)
Run Code Online (Sandbox Code Playgroud)

但是为了创建比这更短的东西latest_site_group_test_runs_path(site,group),可以像routes这样在routes.rb中添加一个匹配声明:

match 'sites/:site_id/groups/:id/test_runs/latest' => 'test_runs#latest', :as => :latest_tests
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用latest_tests_path(site,group)或latest_tests_url(site,group)来生成完全嵌套的路径.

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

例如,给定@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
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!您似乎应该能够获得应用迁移所需的灵活性.

注意:我忽略了一个名为"测试"的模型的潜伏问题,因为那是关于主题的;-)由于命名空间和关键字冲突,有一些模型名称是一种无休止的痛苦来源.我最喜欢的是当我真的想要一个名为"Case"的模式时(因为它最符合问题域.不好的想法,快速逆转!)