我试图从另一个控制器助手调用一个控制器助手(一个模块)中的方法。这似乎是不可能的,即使这种方法是在module_function
下。
我想我在Ruby中缺少一个基本原则,因为我很新手。还有,我觉得我错过了如何在Rails下编写正确的OOP。
更新:这是一个例子:
我有FirstController
和SecondController
,以及每个的辅助模块
module FirstHelper
module_function
def methodA
...
end
end
module SecondHelper
def methodB
FirstHelper.methodA
end
end
FirstHelper.methodA
对SecondHelper
的调用返回错误:
undefined方法`methodA'用于SecondHelper:Module
模块是方法和常量的集合。它基本上提供了命名空间并防止名称冲突。您需要在第二个模块中包含或扩展第一个模块。
Include用于向类的实例添加方法,Extend用于添加类方法。 Read this for more information或this。在你的情况下,你可以做这样的事情:
module FirstHelper
def self.methodA
...
end
end
module SecondHelper
include FirstHelper
def methodB
FirstHelper.methodA
end
end
Helper方法是实例方法,不能通过模块访问,但只能包含它们所包含的类。所有帮助程序都包含在视图上下文对象中,因此您应该只能通过名称访问它们:
module SecondHelper
def methodB
methodA
end
end
使用require代替包含它将起作用
module FirstHelper
class << self
def methodA
...
end
end
end
require 'lib/first_helper'
module SecondHelper
def methodB
FirstHelper.methodA
end
end