如何在Rails中正确使用控制器帮助模块,以及如何在这些帮助模块之间进行连接



我试图从另一个控制器辅助器调用一个控制器辅助器(模块)中的方法。这似乎是不可能的,即使该方法是在module_function下。

我想我错过了Ruby的一个基本原则,因为我是一个相当新手。而且我感觉我错过了如何在Rails下正确编写OOP的要点。

更新:这里是一个例子:

我有FirstControllerSecondController,以及每个

的辅助模块
module FirstHelper
  module_function
  def methodA
    ...
  end
end

module SecondHelper
  def methodB
    FirstHelper.methodA
  end
end

SecondHelper调用FirstHelper.methodA返回错误:

未定义的方法' methodA'为SecondHelper:Module

模块是方法和常量的集合。它基本上提供了一个名称空间并防止名称冲突。您需要在Second模块中包含或扩展First模块。

Include用于向类的实例添加方法,而Extend用于添加类方法。阅读这篇文章了解更多信息。在您的情况下,您可以这样做:

module FirstHelper
  def self.methodA
    ...
  end
end
module SecondHelper
  include FirstHelper
  def methodB
    FirstHelper.methodA
  end
end

Helper方法是实例方法,不能通过模块访问,只能通过包含它们的vie类访问。所有的帮助程序都包含在视图上下文对象中,因此您应该能够仅通过名称访问它们:

module SecondHelper
  def methodB
    methodA
  end
end

用require代替include就可以了

module FirstHelper
  class << self
    def methodA
      ...
    end
  end
end

require 'lib/first_helper'
module SecondHelper
  def methodB
    FirstHelper.methodA
  end
end

最新更新