2008-09-05 7 views
2

Je travaille sur une application Rails et je cherche à inclure une fonctionnalité de "Getting the Hostname or IP in Ruby on Rails" que j'ai demandée.Ajouter des fonctionnalités à Rails

J'ai des problèmes pour le faire fonctionner. J'avais l'impression que je devrais faire un fichier dans le répertoire lib, donc je l'ai appelé « get_ip.rb », avec le contenu:

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 

J'avais aussi essayé de définir GetIP comme une classe, mais quand je faire l'habituel ruby script/console, je ne suis pas en mesure d'utiliser la méthode local_ip du tout. Des idées?

Répondre

4

Vous n'avez pas décrit comment vous essayez d'utiliser la méthode, alors je m'excuse d'avance si c'est ce que vous savez déjà.

Les méthodes sur un module ne sont jamais utilisées sauf si le module est inclus dans une classe. Les méthodes d'instance sur une classe requièrent une instance de la classe. Vous voulez probablement une méthode de classe à la place. Et le fichier lui-même doit être chargé, généralement via l'instruction require.

Si le code suivant dans le fichier 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 

alors vous devriez être en mesure de l'exécuter en disant

require 'getip' 
GetIP.local_ip 
5

require va charger un fichier. Si ce fichier contient des définitions de classe/module, votre autre code pourra désormais les utiliser. Si le fichier ne contient que du code qui n'est dans aucun module, il sera exécuté comme s'il était au même endroit que votre appel 'require' (comme PHP include)

include concerne les modules.

Il prend toutes les méthodes du module et les ajoute à votre classe. Comme ceci:

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. 

Il y a aussi extend qui fonctionne comme comprennent le fait, mais au lieu d'ajouter les méthodes comme exemple les méthodes, les ajoute comme méthodes classe, comme ceci:

note ci-dessus, comment quand je voulais accéder à first_method, j'ai créé un nouvel objet de classe Orig. C'est ce que je veux dire par méthode d'instance.

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

Notez que dans cet exemple, je ne fais pas de nouveaux objets, simplement appeler la méthode directement sur la classe, comme si elle avait été définie comme self.first_method tout le long.

Donc là vous allez :-)

0

require et include sont deux choses différentes.

require est de charger strictement un fichier une fois à partir d'un chemin de chargement. Le chemin de chargement est une chaîne et c'est la clé utilisée pour déterminer si le fichier a déjà été chargé.

include est utilisé pour "mélanger" des modules dans d'autres classes.include est appelée sur un module et les méthodes de module sont incluses en tant que méthodes d'instance dans la classe.

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 

Mais plusieurs fois, le module que vous voulez mélanger n'est pas dans le même fichier que la classe cible. Donc vous faites un require 'module_file_name' et ensuite dans la classe vous faites un include module.

Questions connexes