【问题标题】:Nested resources or not for categories?类别的嵌套资源与否?
【发布时间】:2011-12-02 16:53:28
【问题描述】:

我有一个使用 Rails 3.1.3 构建的应用程序,其中包含产品和类别。类别与其他类别相关,因此类别可以是父类别或子类别。然后产品与子类别相关。

现在,我正在考虑如何定义路线。以某种方式嵌套类别和产品资源是个好主意吗?理想情况下,我想要这样的 URL:

example.com/parent/child/product-1234

like this:
example.com/clothes/underwear/some-socks-1234

or maybe like this to keep it restful?
example.com/p/clothes/c/underwear/....

但是用路线来实现可能有点混乱?我猜我必须将类别与自身嵌套?

关于如何实现这样的目标有什么想法吗?

编辑: 我是否像这样创建类别路由:

resources :categories, :as => "parent" do
    resources :categories, :as => "child"
end

或类似的?将产品嵌套在类别中并不那么重要。也许它只会让管理变得困难......

【问题讨论】:

  • Rails 确实内置了对格式为“12345-some-textual-name”的 URL 中的 id 的支持。控制器的非数字部分被删除,但它使 URL slug 看起来更好看。
  • @Nick 是的。但是实际的嵌套呢?我可以做一些类似于我添加到原始问题中的事情吗?将其嵌套在自身内部?

标签: ruby-on-rails


【解决方案1】:

你可以是 RESTful 也可以不是,你不能同时拥有它。

如果 Category 是资源,那么您可以使用 resource :categories 语句定义路由并使用 Rails 内置的 REST 支持。但是所有类别都应该可以通过categories/id 访问。如果您希望通过不同的路由访问不同的类别,那么您就不是 RESTful 并且不能使用 Rails 的 REST 支持。

或者,您可以说父类别和子类别是不同的资源并再次成为 RESTful。

编辑:现在看我的答案(在它被接受之后)我觉得我可能太僵硬了。答案可能应该是“视情况而定”(像往常一样)。如果应用程序是 CRUD(管理员),我会坚持使用普通类别和嵌套产品(浅)。在您需要漂亮 url 的店面中,您完全可以拥有非 REST 路由和操作。这只是意味着更多的编码。

【讨论】:

    【解决方案2】:

    我会在 RESTful 路由之外添加一个额外的路由来支持您的 URL。这会忽略类别(它们甚至不必存在)并直接路由到产品。

      ...
    
      resources :products
      resources :categories
    
      match ':parent/:child/:product' => "products#show"
    
      ...
    

    在您的显示操作中,您可以简单地检查设置了params[:product]params[:id] 中的哪一个并处理不同的路由。 params[:parent]params[:child] 也将可用,但我建议只查找产品并通过该对象获取类别,因为这样应该更可靠。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      相关资源
      最近更新 更多