如何在 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。

更新:这是一个例子:

我有 FirstControllerSecondController,每个都有帮助模块

module FirstHelper
  module_function

  def methodA
    ...
  end
end


module SecondHelper
  def methodB
    FirstHelper.methodA
  end
end

SecondHelperFirstHelper.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 中正确使用控制器辅助模块,以及如何连接这些辅助模块?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 模块中定义辅助方法?

如何测试作为 helper_method 公开的 Rails 控制器方法?

如何在 Ruby on Rails 的控制台中调用控制器/视图辅助方法?

从 Rails 3 控制器调用辅助方法

如何在 Rails 中找到方法来自的模块/类?

了解 Ruby on Rails 6 中的路由 + 模块/类名称 [以及在此上下文中模块是啥]