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

标签 ruby-on-rails-3 routes helpers

我正在将 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/

相关文章:

post - Rails 3 使用 POST 重定向

ruby-on-rails - Rails 多连接 AR 查询和 where 子句

javascript - 如何从 Angular 中的子路由组件访问父组件属性?

ionic-framework - Ionic 2/Angular 2 路由 - 渐进式 Web 应用程序

ruby-on-rails - 助手 “fields_for”无法正常工作

ruby-on-rails - 为什么 View 中的 block 被渲染两次?

ruby - Rails 3 - 更灵活的 time_ago_in_words

ruby-on-rails-3 - 登录重定向到主页而不是停留在同一页面

algorithm - 修改 Dijkstra 以在给定额外属性的情况下找到最优化的最短路径

nested - 如何在 Handlebars 中使用多个助手