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结构,所以浅路径似乎不是答案.
好消息是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"的模式时(因为它最符合问题域.不好的想法,快速逆转!)
| 归档时间: |
|
| 查看次数: |
3884 次 |
| 最近记录: |