我正在构建我的第一个rails应用程序,并对我应该在哪里定义我的方法有一些疑问。我的背景如下:
我有一个/ v1 / api / orders控制器,它接收包含订单和lineitem信息的JSON消息。该控制器将检查JSON消息并创建订单。它还会拆分订单项并创建与订单相关的订单项。
现在我的下一步是对订单项执行一些检查,然后创建货件记录。现在我有点迷失,我应该在哪里定义创建货运记录的方法以及如何调用它。我可以在订单控制器中创建另一种方法,但我觉得这不是正确的地方。
什么是最佳实践'定义这个方法的地方?我是否还应该在其他地方创建订单项?
答案 0 :(得分:2)
最佳做法是您的控制器应遵循单一责任原则。如果您在REST术语中考虑这一点,您的控制器应该努力只负责单个资源。
您的OrdersController
应负责CRUD:订单,ShipmentsController
货件等。
但是,您也有嵌套资源的概念。订单包含许多项目,可能有很多货物。
我们的路线可能看起来像这样(请注意,为简洁起见,我省略了/v1/api/
前缀。)
Rails.application.routes.draw do
resources :orders, shallow: true, except: [:new, :edit] do
resources :line_items, except: [:new, :edit]
resources :shipments, except: [:new, :edit]
end
end
如果我们运行rake routes
,您可以看到这是如何将网址映射到控制器:
Prefix Verb URI Pattern Controller#Action
order_line_items GET /orders/:order_id/line_items(.:format) line_items#index
POST /orders/:order_id/line_items(.:format) line_items#create
line_item GET /line_items/:id(.:format) line_items#show
PATCH /line_items/:id(.:format) line_items#update
PUT /line_items/:id(.:format) line_items#update
DELETE /line_items/:id(.:format) line_items#destroy
order_shipments GET /orders/:order_id/shipments(.:format) shipments#index
POST /orders/:order_id/shipments(.:format) shipments#create
shipment GET /shipments/:id(.:format) shipments#show
PATCH /shipments/:id(.:format) shipments#update
PUT /shipments/:id(.:format) shipments#update
DELETE /shipments/:id(.:format) shipments#destroy
orders GET /orders(.:format) orders#index
POST /orders(.:format) orders#create
order GET /orders/:id(.:format) orders#show
PATCH /orders/:id(.:format) orders#update
PUT /orders/:id(.:format) orders#update
DELETE /orders/:id(.:format) orders#destroy
您应该注意的一件事是,所有这些都是通过标准CRUD动词完成的。如果你开始添加诸如OrdersController#create_shipment
之类的东西,那你就错了。
然而实际上有时域变得复杂并且不可能完全遵循REST和SRP - 这没关系 - 只是试着想一想你想要做的事情是否可以先用普通的CRUD动作完成。