是否嵌套资源?

时间:2011-12-02 16:53:29

标签: ruby-on-rails

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

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

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

或类似?将产品嵌套在类别中并不重要。也许这只会让你很难管理......

2 个答案:

答案 0 :(得分:1)

你可以是RESTful,也可以不是,你不能两种方式。

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

或者,您可以说父类别和子类别是不同的资源,并且可以再次使用REST。

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

答案 1 :(得分:1)

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

  ...

  resources :products
  resources :categories

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

  ...

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