Ruby on Rails:模块与类

Jac*_*kCA 19 ruby-on-rails

我正在尝试添加一个可以在我的程序的所有部分访问的功能.我想要的东西:

def GlobalFunctions.my_function(x,y)
    puts x + y
end
Run Code Online (Sandbox Code Playgroud)

适用于所有型号.具体来说,我试图在我的seeds.rb文件中使用这样的函数,但我很可能会重用代码而不需要任何冗余.现在我知道我可以做一个简单的课,但我也可以制作一个模块.朝哪个方向走的是什么原因?一旦我决定使用哪种类型,我如何在整个程序中访问它?

我已经尝试了一个模块,但我一直得到"预期app/[模块文件]来定义[ModuleName]"

Pre*_*ids 43

你要为你想要制作实例的东西定义一个类.在这种情况下,模块可能会更好,因为模块基本上只是将代码组合在一起:

module GlobalFunctions
  def self.my_function(x,y)
    puts x+y
  end
end

GlobalFunctions.my_function(4,5) # => 9
Run Code Online (Sandbox Code Playgroud)

或者,您可以在内核上定义它,然后在任何地方调用它.内核是定义诸如puts之类的方法的地方.

def Kernel.my_function(x,y)
  puts x + y
end

my_function(4,5) # => 9
Run Code Online (Sandbox Code Playgroud)


小智 17

向Kernel添加方法(来自PreciousBodilyFluids的答案)通常被认为是难闻的气味,并且可能导致一些在大型项目中很难找到错误.

相关命名空间并将其放入/ lib /更为可接受.

class Formatting
  def self.bold(str)
    return "<strong>#{str}</strong>"
  end
end
Run Code Online (Sandbox Code Playgroud)

然后你可以:

require 'formatting'
puts Formatting.bold("text")
Run Code Online (Sandbox Code Playgroud)

要么

require 'formatting'
include Formatting

puts bold("text")
Run Code Online (Sandbox Code Playgroud)

对于那些稍后使用您的代码的人来说,这也很清楚.如果您使用的是Rails,则不需要.