我正在将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”的模式时(因为它最符合问题领域.糟糕的想法,迅速逆转!)