如何在 Rails 中正确使用控制器辅助模块,以及如何连接这些辅助模块?
Posted
技术标签:
【中文标题】如何在 Rails 中正确使用控制器辅助模块,以及如何连接这些辅助模块?【英文标题】:How to correctly use controllers helper modules in Rails, and how to connect between those helpers? 【发布时间】:2014-07-17 07:14:24 【问题描述】:我正在尝试从另一个控制器助手调用一个控制器助手(模块)中的方法。这似乎是不可能的,即使那个方法在module_function
下。
我想我在 Ruby 中缺少一个基本原则,因为我还是个新手。另外感觉我错过了如何在 Rails 下编写正确的 OOP。
更新:这是一个例子:
我有 FirstController
和 SecondController
,每个都有帮助模块
module FirstHelper
module_function
def methodA
...
end
end
module SecondHelper
def methodB
FirstHelper.methodA
end
end
从SecondHelper
对FirstHelper.methodA
的调用返回错误:
SecondHelper:Module 的未定义方法 `methodA'
【问题讨论】:
您能否更具体地说明您想做什么,举个例子会很好:D 从另一个助手的方法调用一个助手的方法应该不是问题。你能把你的控制器和助手贴出来仔细看看吗? 我刚刚复制了你的代码(使用简单的 mods),我没有发现问题... module FirstHelper module_function def methodA "Hello there" end end module SecondHelper module_function def methodB FirstHelper.methodA end end puts SecondHelper.methodB => 你好 您是否在第二个模块like this 中“包含”了您的第一个模块? 【参考方案1】:模块是方法和常量的集合。它基本上提供了一个命名空间并防止名称冲突。您需要在您的第二个模块中包含或扩展您的第一个模块。
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
【讨论】:
定义模块方法将使其在视图上下文中不可访问。【参考方案2】:Helper 方法是实例方法,不能通过模块访问,只能通过它们包含的类来访问。所有帮助器都包含在视图上下文对象中,因此您应该能够简单地通过名称访问它们:
module SecondHelper
def methodB
methodA
end
end
【讨论】:
【参考方案3】:使用 require 而不是 include 它会起作用
module FirstHelper
class << self
def methodA
...
end
end
end
require 'lib/first_helper'
module SecondHelper
def methodB
FirstHelper.methodA
end
end
【讨论】:
以上是关于如何在 Rails 中正确使用控制器辅助模块,以及如何连接这些辅助模块?的主要内容,如果未能解决你的问题,请参考以下文章
如何测试作为 helper_method 公开的 Rails 控制器方法?