如何在Rails中正确使用控制器助手模块,以及如何在这些助手之间建立连接?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Rails中正确使用控制器助手模块,以及如何在这些助手之间建立连接?相关的知识,希望对你有一定的参考价值。

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

我想我在Ruby中缺少一个基本原则,因为我很新手。还有,我觉得我错过了如何在Rails下编写正确的OOP。

更新:这是一个例子:

我有FirstControllerSecondController,以及每个的辅助模块

module FirstHelper
  module_function

  def methodA
    ...
  end
end


module SecondHelper
  def methodB
    FirstHelper.methodA
  end
end

FirstHelper.methodASecondHelper的调用返回错误:

undefined方法`methodA'用于SecondHelper:Module

答案

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

Include用于向类的实例添加方法,Extend用于添加类方法。 Read this for more informationthis。在你的情况下,你可以做这样的事情:

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

以上是关于如何在Rails中正确使用控制器助手模块,以及如何在这些助手之间建立连接?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 rails 模块访问 URL 助手

将 Rails 代码从控制器移动到助手时如何修复它?

Rails:如何访问 RESTful 助手?

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?

在哪里放置不是模型、视图、控制器或助手的 Rails 代码?

(Rails)从不同视图中的控制器访问方法