向Rails添加功能

Chr*_*nch 2 ruby ruby-on-rails

我正在研究一个Rails应用程序,并且我希望包含一些功能,这些功能来自我在"Ruby on Rails中获取主机名或IP ".

我在使用它时遇到了问题.我的印象是我应该在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
Run Code Online (Sandbox Code Playgroud)

我也曾尝试将GetIP定义为一个类,但是当我按照惯例执行时ruby script/console,我根本无法使用该local_ip方法.有任何想法吗?

Ori*_*rds 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.
Run Code Online (Sandbox Code Playgroud)

还有extend像include这样的工作,但不是将方法作为实例方法添加,而是将它们添加为方法,如下所示:

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

class SecondClass
  extend MyModule
end
SecondClass.first_method # will call first_method
Run Code Online (Sandbox Code Playgroud)

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

所以你去:-)