在哪里定义创建相关模型的方法

时间:2016-02-09 11:45:15

标签: ruby-on-rails

我正在构建我的第一个rails应用程序,并对我应该在哪里定义我的方法有一些疑问。我的背景如下:

我有一个/ v1 / api / orders控制器,它接收包含订单和lineitem信息的JSON消息。该控制器将检查JSON消息并创建订单。它还会拆分订单项并创建与订单相关的订单项。

现在我的下一步是对订单项执行一些检查,然后创建货件记录。现在我有点迷失,我应该在哪里定义创建货运记录的方法以及如何调用它。我可以在订单控制器中创建另一种方法,但我觉得这不是正确的地方。

什么是最佳实践'定义这个方法的地方?我是否还应该在其他地方创建订单项?

1 个答案:

答案 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动作完成。