gpt4 book ai didi

ruby-on-rails-3 - Rails 3 嵌套资源的简称?

转载 作者:行者123 更新时间:2023-12-04 10:43:09 24 4
gpt4 key购买 nike

我正在将 Rails 2.3 应用程序升级到 Rails 3。在 Rails 2.3 路由器中,可以设置 :name_prefix嵌套资源的 nil 以获得更短的名称。实际的 URL 仍然是完全限定的,但代码可以使用较短的名称。例如。,:

map.resources :sites 做 |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 }
结尾
结尾

将允许使用 latest_tests_path .我不知道如何用 Rails 3 做同样的事情,所以我被 latest_site_group_tests_path 困住了.如果这是它需要的方式,我可以通过代码并更改它的每个实例。但我想确保我没有错过任何东西。不管好坏,我确实需要维护 URL 结构,因此浅层路由似乎不是答案。

最佳答案

好消息是 Rails 3 仍然能够设置任意/缩写的 url 助手。您可以使用 match 创建简短的 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 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)

但是要创建比 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

希望有帮助!看起来您应该能够获得应用程序迁移所需的灵活性。

NB:我掩盖了一个名为“Test”的模型的潜在问题,因为那是题外话;-) 由于命名空间和关键字冲突,有一些模型名称是永无止境的痛苦来源。我的另一个最爱是当我真的想要一个名为“Case”的模式时(因为它最匹配问题域。坏主意,迅速逆转!)

关于ruby-on-rails-3 - Rails 3 嵌套资源的简称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7623142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com