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结构,所以浅路径似乎不是答案.
解决方法
假设我们有这样的路由设置(注意你需要保持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”的模式时(因为它最符合问题领域.糟糕的想法,迅速逆转!)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。