在rails 2.x中我使用了浅层路由,但这似乎在rails 3中缺失(至少在API http://apidock.com/rails/ActionController/Resources/resources中)。
当我在rails 3中传递此选项时,它不会抛出任何错误,但我也没有得到我期望的所有路径。
Rails 3 routes.rb
resources :users, :shallow=>true do
resources :recipe do
resources :categories do
resources :sections do
resources :details do
end
end
end
end
end
使用rails 2.x等效生成的路径缺少(仅为配方资源的示例):
获取new_recipe(我只有new_user_recipe)和
POST配方(创建新配方,我只有POST user_recipe)
有意义的是,这些路由不会生成,但我的旧代码通过在每种形式中传递user_id来解决它(不太优雅,同意)。
问题是:轨道3中是否存在“浅层”路线的文档?有没有办法生成我在rails 2.x中缺少的路线?
谢谢, 麦克
答案 0 :(得分:5)
您需要将:shallow选项应用于嵌套资源。这应该给你你想要的东西:
resources :users do
resources :recipe, :shallow=>true do
resources :categories do
resources :sections do
resources :details do
end
end
end
end
end
答案 1 :(得分:3)
如果您查看Rails 3文档,您会看到shallow
是ActionDispatch::Routing::Mapper::Resources
上的实例方法,就像resource
,resources
,{{1你应该能够用这样的东西嵌套浅路线:
match
虽然它似乎只是将它们扩展到2级而不是完整的嵌套路由。查看shallow do
resources :users do
resources :recipe do
resources :categories do
resources :sections do
resources :details
end
end
end
end
end
了解更多信息。
答案 2 :(得分:0)
您可以在Rails Guides网站上找到与嵌套或浅层路线相关的Rails 3文档。
在提供有关如何嵌套路线的建议时,它特别指出,“资源不应该嵌套超过1级。”
答案 3 :(得分:0)
您只有new_user_recipe而不是new_recipe是合理的。为什么?因为从食谱的角度来看,每个食谱都属于一个用户。
另一点是
resources :users, :shallow=>true do
resources :recipe do
resources :categories do
resources :sections do
resources :details do
end
end
end
end
end
与
完全相同resources :users do
resources :recipe, :shallow=>true do
resources :categories do
resources :sections do
resources :details do
end
end
end
end
end
其他用户指出, :shallow
是继承的。考虑一下,:shallow
表示一旦确定您正在处理哪个资源,就可以省略URL模式的左侧部分。如果将:shallow
放在资源的最外层,它应该与将其放在第二层(示例中的配方)上具有相同的效果。因为在处理最外层资源(示例中的用户)时没有什么可以省略的,所以它已经是URL模式的最左边部分,并且不能省略。