向Rails添加功能

时间:2008-09-05 05:07:38

标签: ruby-on-rails ruby

我正在开发一个Rails应用程序,并希望包含我问过的“Getting the Hostname or IP in Ruby on Rails”的一些功能。

我遇到了让它上班的问题。我的印象是我应该在lib目录中创建一个文件,因此我将其命名为'get_ip.rb',内容为:

require 'socket'

module GetIP
  def local_ip
    orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true  # turn off reverse DNS resolution temporarily

    UDPSocket.open do |s|
      s.connect '64.233.187.99', 1
      s.addr.last
    end
  ensure
    Socket.do_not_reverse_lookup = orig
  end
end

我还尝试将GetIP定义为一个类但是当我执行通常的ruby script/console时,我根本无法使用local_ip方法。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

require将加载文件。如果该文件包含任何类/模块定义,那么您的其他代码现在将能够使用它们。如果文件只包含不在任何模块中的代码,它将像在“require”调用中一样运行(如PHP包含)

include与模块有关。

它采用模块中的所有方法,并将它们添加到您的类中。像这样:

class Orig
end

Orig.new.first_method # no such method

module MyModule
  def first_method
  end
end

class Orig
   include MyModule
end
Orig.new.first_method # will now run first_method as it's been added.

还有extend与include一样,但不是将方法添加为实例方法,而是将它们添加为 class 方法,如下所示:< / p>

请注意,当我想访问first_method时,我创建了一个Orig类的新对象。这就是我所说的实例方法。

class SecondClass
  extend MyModule
end
SecondClass.first_method # will call first_method

请注意,在这个示例中,我没有创建任何新对象,只是直接在类上调用该方法,就好像它一直被定义为self.first_method一样。

所以你去: - )

答案 1 :(得分:4)

你还没有描述你是如何尝试使用这种方法的,所以如果这是你已经知道的东西,我会提前道歉。

除非模块包含在类中,否则模块上的方法永远不会使用。类的实例方法要求有一个类的实例。你可能想要一个类方法。并且应该通常通过require语句加载文件本身。

如果以下代码在getip.rb文件中,

require 'socket'

class GetIP
  def self.local_ip
    orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true

    UDPSocket.open do |s|
      s.connect '64.233.187.99', 1
      s.addr.last
    end
  ensure
    Socket.do_not_reverse_lookup = orig
  end
end

然后你应该能够通过说,

来运行它
require 'getip'
GetIP.local_ip

答案 2 :(得分:0)

requireinclude是两回事。

require是从加载路径严格加载一次文件。 loadpath是一个字符串,这是用于确定文件是否已加载的密钥。

include用于将“混入”模块放入其他类中。在模块上调用include,并将模块方法作为实例方法包含在类中。

  module MixInMethods
    def mixed_in_method
      "I'm a part of #{self.class}"
    end
  end

  class SampleClass
    include MixInMethods
  end

  mixin_class = SampleClass.new
  puts my_class.mixed_in_method # >> I'm a part of SampleClass

但是很多时候你要混合的模块与目标类不在同一个文件中。所以你做require 'module_file_name'然后在课堂上做include module