ruby-on-rails-3 – Rails 3嵌套资源短名称?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails-3 – 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,:collection => { :latest => :get }
    end
  end

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

解决方法

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

假设我们有这样的路由设置(注意你需要保持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

我们得到所有标准的url助手(rake路由):

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)

但要创建比latest_site_group_test_runs_path(site,group)更短的内容,请向routes.rb添加匹配声明,如下所示:

match 'sites/:site_id/groups/:id/test_runs/latest' => 'test_runs#latest',:as => :latest_tests

现在,您可以使用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

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

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

猜你在找的Ruby相关文章