将Rails模型和控制器方法重构为模块

时间:2015-05-06 20:24:26

标签: ruby-on-rails

我有一个Rails应用程序,它开始在控制器中获得大量逻辑:例如当我创建SeatingChart时,我还需要创建一些SeatsSections。所以我将所有这些逻辑包装到一个SeatingChart.transaction块中并在我的控制器中创建了一个方法,该方法执行解析从客户端接收的params的所有复杂逻辑,创建各种模型并确保它们相关联,然后我在控制器的create方法中调用该方法。

我应该将此方法移动到模块中还是可以在控制器中?或者我应该将其移到SeatingChart模型中吗?

另一个问题是:我的一些模型有方法。它们通常是小方法,作为我的Ticket模型的一个示例我有一个方法update_status,它检查reserved_until时间是否已经过去,如果是,则更改了一些值对于那个Ticket的列。这样的方法应该转移到模块,还是最好留给模型?

4 个答案:

答案 0 :(得分:3)

如果可能的话,将代码从控制器移动到模型通常会更好,原因有两个:

1)测试要容易得多,你可以使用单元测试代替集成测试,这样更易​​于设置和运行

2)更容易看到工作。从您的irb中,您可以启动模型并调用方法进行交互。

3)它解耦控制器逻辑。保持控制器指示灯有助于使您的设计更加安静(正如您应该做的那样)。您的控制器只是将您的模型与您的视图联系起来。

如果要在多个控制器中使用该代码,那么您可以正确地将其包装在模块中(查找服务对象)。或者,如果控制器是相关的(也称为彼此继承),那么您只需在其中一个基本控制器中弹出代码。

希望这有帮助

答案 1 :(得分:1)

考虑使用服务对象。并且还考虑virtus gem。 https://github.com/solnic/virtus

答案 2 :(得分:0)

我同意,出于伊兰所说的原因,最好有瘦的控制器。

从我的情况可以看出,我会投票表示你应该在模块中使用该代码主要是因为它允许你分开关注点。模型应该处理某个模型。如果您的代码跨越多个模型,则将其放入模块中可以保持各个模型的清洁。

答案 3 :(得分:0)

我不确定您是否应该考虑在当前情况下使用模块。就个人而言,我觉得它们可以更好地服务于不同模型/控制器的可重用方法。

另外请注意,如果您的SeatingChart数量为SeatsSections,并且您必须通过参数解析并手动创建各种模型和关联,一些结账的东西,让你的生活更轻松。

  1. 如果创建的所有内容都是通过params对象进入的,并且所有内容都已关联,那么您应该可以使用nested forms

    <只使用SeatingChart.create(params[:seating_chart])创建所有内容/ LI>
  2. 如果您没有从表单中获取所有必需的数据来创建关联,请在模型上使用active record callbacks以在保存之前构建所需的关联。