我应该何时在Rails中创建单独的控制器而不是自定义操作?

时间:2014-04-30 17:36:22

标签: ruby-on-rails controllers

考虑一个我有Orders模型的例子。触发index操作会显示系统中的所有订单。

现在我希望有一个单独的页面显示所有已退款订单的图表,另一个页面显示所有已取消的订单 - 不仅现在有一个过滤器,而且还有一个全新的视图好。

什么是最佳做法:

1。)在OrdersController为每个报告创建新的操作(例如refund_reportcancelled_report

2。)使用单个RefundReportController操作为每个报告(例如CancellationReportControllershow)创建新的控制器?

3.。)为所有报告创建一个新控制器(例如OrderReportsController),并为每个报告创建一个操作(例如refundscancellations等。

或者是否还有我完全失踪的另一种范式?

2 个答案:

答案 0 :(得分:6)

使用#1:在OrdersController内为每个报告创建操作。这很简单,资源(Order)通过其关联的控制器可以有多个视图是有道理的。你还没有要求任何特定于这些报告中的任何一个,它是一个好的/简单的模式1:获取行动(和路线)对应于1个视图。

如果您将来发现您正在执行某项特定于报告的操作,请考虑将该报告作为自己的控制器。但这可能永远不会发生,也不需要提前抽象,现在就把自己压低。

基本上,当您想要开始将该事物视为具有自己动作的自己的实体时,请创建一个新的Controller。不要因为默认的REST选项没有为您需要的内容提供特定的成员操作而将某些内容分解为新的控制器。

答案 1 :(得分:3)

  

1。)在OrdersController中为每个报告创建新操作(例如,refund_report和cancelled_report)

这是一种简单而直接的方法。如果你要做的只是从refunded orders过滤掉cancelled ordersOrder并在他们的独立视图中显示它们,那么请使用此功能。此外,您不希望混淆index操作以及index视图。如果您不打算在将来添加任何更多报告并使OrdersController混乱,这也是一种更好的方法。

  

2。)为每个报告创建新的控制器(例如,RefundReportController,CancellationReportController)   显示行动?

根据相关详细信息,Refunded OrdersCancelled Orders的视图主要基于Order模型。因此,为每个报告添加新的控制器似乎不可行。无论如何,这些控制器将会做什么,每个refundscancellations只需一次操作?我不建议采用这种方法。

  

3。)为所有报告(例如,OrderReportsController)创建一个新控制器,并为每个报告创建一个操作(例如,退款,   取消等

这是比方法#1和方法#2更好的方法,在不久的将来,您计划在Order模型上添加更多报告。使用此方法,您只需为OrdersController模型上的CRUD活动保留Order,并为所有报告保留OrderReportsController,即可分离问题可以对从Order检索到的数据生成。

我建议您根据用例选择方法#1 方法#3