Ruby on Rails 模块包含模块

HXH*_*HXH 5 module ruby-on-rails

我想在 Rails 助手中包含一个模块(也是一个模块)。

帮助者是:

module SportHelper 
  .....
end
Run Code Online (Sandbox Code Playgroud)

该模块是:

module Formula
  def say()
    ....
  end
end
Run Code Online (Sandbox Code Playgroud)

say现在,我想使用中的方法SportHelper。我应该怎么办?

如果我这样写:

module SportHelper 
  def speak1()
    require 'formula'
    extend Formula
    say()
  end

  def speak2()
    require 'formula'
    extend Formula
    say()
  end
end
Run Code Online (Sandbox Code Playgroud)

这会起作用,但我不想这样做,我只想在帮助器模块上添加方法,而不是每个方法。

Ant*_*pov 5

您只需将此模块包含在您的助手中即可:

\n\n
require \'formula\'\n\nmodule SportHelper\n  include Formula\n\n  def speak1\n    say\n  end\n\n  def speak2\n    say\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

require \'formula\'如果这一行已经在加载路径中,也许您不需要它。要检查这一点,您可以检查$LOAD_PATH变量。欲了解更多信息,请参阅此答案

\n\n

extend和之间的基本区别include在于,include 用于向类的实例添加方法,而extend 用于添加类方法。

\n\n
module Foo\n  def foo\n    puts \'heyyyyoooo!\'\n  end\nend\n\nclass Bar\n  include Foo\nend\n\nBar.new.foo # heyyyyoooo!\nBar.foo # NoMethodError: undefined method \xe2\x80\x98foo\xe2\x80\x99 for Bar:Class\n\nclass Baz\n  extend Foo\nend\n\nBaz.foo # heyyyyoooo!\nBaz.new.foo # NoMethodError: undefined method \xe2\x80\x98foo\xe2\x80\x99 for #<Baz:0x1e708>\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您extend在对象方法内部使用,它将向类的实例添加方法,但它们仅在该方法内部可用。

\n