Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将Rails模型和控制器方法重构为模块_Ruby On Rails - Fatal编程技术网

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

Ruby on rails 将Rails模型和控制器方法重构为模块,ruby-on-rails,Ruby On Rails,我有一个Rails应用程序,它开始在控制器中获得大量的逻辑:例如,当我创建座位图时,我还需要创建一些座位和部分。因此,我将所有这些逻辑包装到一个SeatingChart.transaction块中,并在我的控制器中创建了一个方法,该方法可以解析从客户端接收到的参数,创建各种模型并确保它们相关联,然后在控制器的create方法中调用该方法 我应该将此方法移动到模块中,还是可以在控制器中?或者我应该把它移到座位图模型中吗 另一个问题是:我的一些模型有方法。它们通常是一些小方法,例如我的Ticket模

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

我应该将此方法移动到模块中,还是可以在控制器中?或者我应该把它移到
座位图
模型中吗


另一个问题是:我的一些模型有方法。它们通常是一些小方法,例如我的
Ticket
模型,我有一个方法
update\u status
,它检查
是否保留到
时间过去,如果保留,则更改该
Ticket
列的一些值。像这样的方法应该移到模块中,还是最好留到模型中去?

如果可能的话,出于以下几个原因,通常最好将代码从控制器移到模型中:

1) 测试要容易得多,您可以使用单元测试而不是更容易设置和运行的集成测试

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

3) 它将控制器逻辑解耦。当使设计更加restfull时(正如您应该做的那样),保持控制器亮起会有所帮助。控制器只是将模型与视图绑定在一起的工具

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


希望这有帮助

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

1) 测试要容易得多,您可以使用单元测试而不是更容易设置和运行的集成测试

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

3) 它将控制器逻辑解耦。当使设计更加restfull时(正如您应该做的那样),保持控制器亮起会有所帮助。控制器只是将模型与视图绑定在一起的工具

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


希望这有助于考虑使用服务对象。并考虑ViTube宝石。 考虑使用服务对象。并考虑ViTube宝石。 我同意,出于ilan所述的原因,最好是使用瘦控制器


从您的情况可以看出,我认为您应该在模块中包含该代码,主要是因为它允许您分离关注点。模型应该处理特定的模型。如果您有跨多个模型的代码,那么将其放在一个模块中可以使各个模型保持干净

我同意,出于ilan所述的原因,最好是使用瘦控制器


从您的情况可以看出,我认为您应该在模块中包含该代码,主要是因为它允许您分离关注点。模型应该处理特定的模型。如果您有跨多个模型的代码,那么将其放在一个模块中可以使各个模型保持干净

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

另一方面,如果您有一个
座位图
,其中有许多
座位
部分
,并且您必须通过参数进行解析,并手动创建各种模型和关联,那么这里有一些要检查的内容,以使您的生活更轻松

  • 如果创建的所有内容都是通过params对象输入的,并且都是关联的,那么您应该能够使用
    SeatingChart.create(params[:seating\u chart])
    创建所有内容

  • 如果您没有从表单中获取创建关联所需的所有数据,请在保存之前在模型上使用以构建所需的关联


  • 我不确定你是否应该考虑在你目前的情况下使用模块。就我个人而言,我觉得它们更适合用于跨不同模型/控制器的可重用方法

    另一方面,如果您有一个
    座位图
    ,其中有许多
    座位
    部分
    ,并且您必须通过参数进行解析,并手动创建各种模型和关联,那么这里有一些要检查的内容,以使您的生活更轻松

  • 如果创建的所有内容都是通过params对象输入的,并且都是关联的,那么您应该能够使用
    SeatingChart.create(params[:seating\u chart])
    创建所有内容

  • 如果您没有从表单中获取创建关联所需的所有数据,请在保存之前在模型上使用以构建所需的关联