当项目具有可选子项时,如何创建资源路径?

时间:2012-04-24 03:11:56

标签: ruby-on-rails-3.1 ruby-on-rails-3.2

如何为具有选项子属性的模型创建路径?假设我正在创建一个帮助台应用程序,并且该票证可能与客户之前与我订购的订单相关联,或者可能与他们尚未订购的目录中的项目有关。

class CustomerServiceTicket
  belongs_to :order
  belongs_to :item
  belongs_to :buyer
  belongs_to :customer_service_category
end

class Order
  ...
  has_one :customer_service_ticket
  ...
end

class Item
  ...
  has_one :customer_service_ticket
  ...
end
customer_service_ticket架构中的

,order_id和item_id可以为空。

所以我会在他们关闭的订单页面上说明他们的order_id旁边有一个'创建客户服务票'链接......以及产品目录页面上item_id旁边的类似链接。

我认为网址结构应如下所示:

customer_service_ticket /新/订单/ 123

创建与订单相关的故障单

customer_service_ticket /新/项目/ 789

创建与项目相关的故障单

而且只是 customer_service_ticket /新 什么时候没有(也适用于客户只有一般性问题的情况)

我如何构建最有效的路线?我没有和上面的URL结构结婚,如果有更好的方式我很乐意尝试它。

1 个答案:

答案 0 :(得分:0)

根据您描述路线的方式,听起来就像您在创建新客户服务票证时已经存在的订单和物品一样,这是正确的吗?如果是这样,那么最好像这样创建你的路线:

orders/123/customer_service_ticket/new
items/123/customer_service_ticket/new
customer_service_tickets/new

每当您将资源添加到现有资源时,新资源通常会在最后进行,您正在执行的操作是URL的最后一部分。要创建这个结构,它将是这样的:

resources :orders do
  resource :customer_service_ticket
end

resources :items do
  resource :customer_service_ticket
end

resources :customer_service_ticket

但是,您可能还想重新考虑您的人际关系。一旦客户服务关闭订单/项目,您确定永远不会有与该订单/项目相关的其他客户服务票证吗?这可能表示has_many关系。您可能还希望查看订单和项目与客户服务票证的多态关系。这样,如果要添加更多可与客户服务票证相关的实体,则不必继续添加数据库字段。请注意,更改为has_many会稍微更改上面的路由声明。