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

时间:2013-11-19 11:26:40

标签: 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是在上述控制器中重复的一些方法。我不想将它们移动到ApplicationController,因为它会使控制器变重并且它们将变为全局。此外,一些方法是私人的。什么是理想的解决方案?

2 个答案:

答案 0 :(得分:0)

将常用功能重构为辅助方法,然后从Controller中调用这些方法。请参阅:http://api.rubyonrails.org/classes/ActionController/Helpers.html

如果您遇到方法完全相同的情况(BTW,这很奇怪,并且表示您的代码的其他问题比重复更加隐蔽),您仍然可以将它们放入模块中并将每个模块包含在控制器中。模块是Ruby语言的一个特性,而不是Rails框架。

答案 1 :(得分:0)

这取决于一百万件事,但我们会从小事做起。首先,没有理由你不能在控制器中包含一个模块,因为毕竟它只是一个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