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
Ruby on rails 在rails 3中放置重复控制器方法的位置_Ruby On Rails_Methods_Controller - Fatal编程技术网

Ruby on rails 在rails 3中放置重复控制器方法的位置

Ruby on rails 在rails 3中放置重复控制器方法的位置,ruby-on-rails,methods,controller,Ruby On Rails,Methods,Controller,我正在重构rails 3项目。假设我有控制器A、B、C和D。下面是驻留在控制器中的方法。现在,如果我们在模型中有常用方法,我们将它们放在模块中,并将该模块包括在模型中。但我们如何解决控制器的代码重复问题呢 A B C D ---------------------- m1 m1 m1 m2 m2 m2 m2 m3 m3 这里,m1、m2、m3和m4是在上述控制器中重复的一些方法。我不想将它们移动到Appli

我正在重构rails 3项目。假设我有控制器A、B、C和D。下面是驻留在控制器中的方法。现在,如果我们在模型中有常用方法,我们将它们放在模块中,并将该模块包括在模型中。但我们如何解决控制器的代码重复问题呢

 A     B     C     D
----------------------
 m1    m1    m1
 m2    m2    m2    m2
       m3    m3    

这里,m1、m2、m3和m4是在上述控制器中重复的一些方法。我不想将它们移动到ApplicationController,因为这将使控制器变得沉重,并且它们将成为全局的。此外,有些方法是私有的。理想的解决方案是什么?

将公共功能重构为助手方法,然后从控制器调用这些方法。见此:


如果您有一个方法完全相同的情况(顺便说一句,这会很奇怪,而且代码中的其他问题比重复更隐蔽),您仍然可以将它们放入模块中,并将每个模块包含在控制器中。模块是Ruby语言的一项功能,而不是Rails框架。

这取决于一百万件事情,但我们将从小事做起。首先,没有理由不能在控制器中包含模块,因为它毕竟只是一个Ruby类

正如前面简要提到的,在决定如何清理之前,您应该先看看为什么会有这些重复的代码。可能代码属于helper/presenter/decorator,因为它与表示逻辑有关。也许代码属于模型,因为它不是表示逻辑,但它确实与表示真实世界有关

也许代码实际上属于ApplicationController,就像您示例中的m2一样。如果它是4个控制器中使用的特定于控制器的帮助器,那么ApplicationController可能不是一个好地方

正如您在一篇评论中所说的,这可能非常简单,只需将模块放在lib目录中,并将其包含在您需要的任何地方。不要忘记,您也可以用类似的方式测试模块(您应该这样做):

class MyModuleTest < ActiveSupport::TestCase
  class ModuleIncluder
    include MyModule
  end

  test "some method should do a thing" do
    ... test content ...
  end
end
类MyModuleTest
那么您说m1、m2、m3应该移动到助手,并且该助手应该包含在控制器中?不,助手不应该包含在控制器中。可以在控制器中调用它们的方法。在控制器中包含帮助程序是一种糟糕的编程做法?您不需要这样做。由于rails的设置方式,它们已经包含在控制器中。我想我应该将它们移动到lib中的一个模块,并将该模块包含在控制器中。我将方法添加到模块中,并将它们包含在控制器中。