我使用嵌套资源和文档
遇到了我的第一个问题http://guides.rubyonrails.org/routing.html#limits-to-nesting
我完全无法弄清楚如何理解这一点,以及如何正确地应用于我的情况,目前我的设置是这样的:
resources :stores do
resources :locations do
resources :business_hours
end
end
现在我想限制嵌套,他们推荐的方式,但我不确定如何实现这一点,因为地点属于商店,营业时间属于地点。
答案 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
locations
个show
路径,这将保留其成员edit
下的操作(/stores/1/locations/2
,{{1}}等),或者您需要使用较少的Rails帮助程序手动指定所需的路径。