使用shallowing正确配置嵌套资源

时间:2016-01-13 14:33:23

标签: ruby-on-rails

我使用嵌套资源和文档

遇到了我的第一个问题

http://guides.rubyonrails.org/routing.html#limits-to-nesting

我完全无法弄清楚如何理解这一点,以及如何正确地应用于我的情况,目前我的设置是这样的:

  resources :stores do
    resources :locations do
      resources :business_hours
    end
  end

现在我想限制嵌套,他们推荐的方式,但我不确定如何实现这一点,因为地点属于商店,营业时间属于地点。

2 个答案:

答案 0 :(得分:0)

rails文档基本上说的是,使用上面的资源配置,您将在网页上看到类似这样的网址。

mywebapplication.com/stores/1/locations/1/business_hours/1

使用代码的相应rails helper方法

stores_locations_business_hours_url

现在没有任何问题,你可以这样做但你会开始遇到乏味的问题,尤其是你的business_hours控制器。原因是因为对于您的控制器,您必须传入以下之前的每个@model对象。你必须做类似的事情

stores_locations_business_hours_url([@store,@location,@business_hour])

访问页面。要限制你需要做这样的事情:

resources :stores do
    resources :locations, shallow: true
end

resources :locations do
    resources :business_hours
end

现在,而不是mywebapplication.com/stores/1/locations/1,网址将会是mywebapplication.com/locations/1,而现在您的营业时间网址将会达到一个级别。这就是文档的含义。

答案 1 :(得分:0)

要了解Rails想要您做的事情,您只需要为每个嵌套shallow: true添加resources

resources :stores do
  resources :locations, shallow: true do
    resources :business_hours, shallow: true
  end
end

正如他们所说,这产生了“用最少量信息来唯一识别资源的路线”,如下所示:

                    Prefix Verb   URI Pattern                                          Controller#Action
   location_business_hours GET    /locations/:location_id/business_hours(.:format)     business_hours#index
             business_hour GET    /business_hours/:id(.:format)                        business_hours#show
           store_locations GET    /stores/:store_id/locations(.:format)                locations#index
                  location GET    /locations/:id(.:format)                             locations#show
                    stores GET    /stores(.:format)                                    stores#index
                     store GET    /stores/:id(.:format)                                stores#show

locations的集合操作,例如。 index嵌套在stores下,因为locations属于stores,但为了识别特定位置,路线引用locations/1而不是stores/前缀,因为您不需要store ID来标识location

这在树下级联:为了识别business_hours集合操作,您需要location所属的小时数,但由于您拥有location ID,因此您不需要涉及store,因此您获得locations/:id/business_hours。如果您需要特定的小时数,则不再需要location,因此您只需/business_hours/1

如果要维护小时收集路径的整个层次结构(即/stores/1/location/2/business_hours),则需要shallow locationsshow路径,这将保留其成员edit下的操作(/stores/1/locations/2,{{1}}等),或者您需要使用较少的Rails帮助程序手动指定所需的路径。