Rails 3,浅路线

时间:2011-04-08 23:32:51

标签: ruby-on-rails ruby-on-rails-3 routes

在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中缺少的路线?

谢谢, 麦克

4 个答案:

答案 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文档,您会看到shallowActionDispatch::Routing::Mapper::Resources上的实例方法,就像resourceresources,{{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模式的最左边部分,并且不能省略。