Ruby on Rails:模块与类

时间:2010-03-11 18:55:41

标签: ruby-on-rails

我正在尝试添加一个可以在程序的所有部分中访问的函数。我想要这样的东西:

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

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

我已经尝试了一个模块,但我不断收到“预期app / [模块文件]来定义[ModuleName]”

3 个答案:

答案 0 :(得分:42)

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

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

GlobalFunctions.my_function(4,5) # => 9

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

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

my_function(4,5) # => 9

答案 1 :(得分:17)

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

相关地命名代码并将其放入/ lib /.

更为可接受
class Formatting
  def self.bold(str)
    return "<strong>#{str}</strong>"
  end
end

然后你可以:

require 'formatting'
puts Formatting.bold("text")

require 'formatting'
include Formatting

puts bold("text")

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

答案 2 :(得分:2)

PreciousBodilyFluids是正确的,如果此GlobalFunctions是RoR项目的一部分,您可能需要将文件命名为global_functions.rb并将其放在lib/目录中,以帮助您避免您在问题结尾处发布的错误消息。