Ruby on rails 在rails 3中放置重复控制器方法的位置
我正在重构rails 3项目。假设我有控制器A、B、C和D。下面是驻留在控制器中的方法。现在,如果我们在模型中有常用方法,我们将它们放在模块中,并将该模块包括在模型中。但我们如何解决控制器的代码重复问题呢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
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中的一个模块,并将该模块包含在控制器中。我将方法添加到模块中,并将它们包含在控制器中。