Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding functionality to Rails

I'm working on a Rails app and am looking to include some functionality from "Getting the Hostname or IP in Ruby on Rails" that I asked.

I'm having problems getting it to work. I was under the impression that I should just make a file in the lib directory, so I named it 'get_ip.rb', with the contents:

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

I had also tried defining GetIP as a class but when I do the usual ruby script/console, I'm not able to use the local_ip method at all. Any ideas?

like image 205
Chris Bunch Avatar asked Feb 04 '26 22:02

Chris Bunch


1 Answers

require will load a file. If that file contains any class/module definitions, then your other code will now be able to use them. If the file just contains code which is not in any modules, it will get run as if it were in the same place as your 'require' call (like PHP include)

include is to do with modules.

It takes all the methods in the module, and adds them to your class. Like this:

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.

There's also extend which works like include does, but instead of adding the methods as instance methods, adds them as class methods, like this:

Note above, how when I wanted to access first_method, I created a new object of Orig class. That's what I mean by instance method.

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

Note that in this example I'm not making any new objects, just calling the method directly on the class, as if it had been defined as self.first_method all along.

So there you go :-)

like image 158
Orion Edwards Avatar answered Feb 06 '26 11:02

Orion Edwards



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!