2011-04-08 40 views
8

在rails 2.x中,我使用浅层路由,但是这似乎是从rails 3中丢失的(至少在API http://apidock.com/rails/ActionController/Resources/resources中)。Rails 3,浅层路由

当我在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 

失踪与轨道2.X相当于中生成的路线是(只用于配方资源的样本):

GET new_recipe(我只有new_user_recipe)和

POST配方(以创建一个新的配方,我只有POST user_recipe)

它是有道理的,这些路线不会生成,但我的旧代码通过在每个表单中传递user_id(较不优雅,同意)来解决它。

问题是:在轨道3中是否存在“浅”路线的文档?有没有办法来生成我从轨道2.x缺少的路线?

谢谢, 迈克

回答

5

您需要的应​​用:浅选项嵌套的资源。这应该给你想要的东西:

resources :users do 
    resources :recipe, :shallow=>true do 
     resources :categories do 
     resources :sections do 
      resources :details do 
      end 
     end 
     end 
    end 
    end 
+1

但API文档(至少2.x)说:浅是继承?我尽量少尝试,但似乎没有办法。 – CambridgeMike 2011-04-09 17:59:12

3

如果你看一下Rails 3个的文档,你会看到shallowActionDispatch::Routing::Mapper::Resources实例方法,就像resourceresourcesmatch,等你应该能够窝浅路线像这样的东西:

shallow do 
    resources :users do 
    resources :recipe do 
     resources :categories do 
     resources :sections do 
      resources :details 
     end 
     end 
    end 
    end 
end 

虽然它只是似乎他们扩展到2级,而不是完全嵌套的路线。查看rake routes获取更多信息。

0

您可以在Rails Guides网站上找到有关嵌套路径或浅路径的Rails 3文档。

在提供有关如何嵌套路线的建议时,它特别指出:“资源永远不应嵌套超过1级。”

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模式的最左侧部分,不能省略。