L'ajout d'une fonctionnalité de Rails
-
09-06-2019 - |
Question
Je suis en train de travailler sur une application Rails, et je suis à la recherche pour inclure certaines fonctionnalités de "Obtenir le nom d'hôte ou son adresse IP dans Ruby on Rails"qu'ai-je demandé.
Je vais avoir des problèmes pour la faire fonctionner.J'étais sous l'impression que je devrais juste faire un fichier dans le répertoire lib, donc j'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 en tant que classe, mais quand je fais l'habitude ruby script/console
, Je ne suis pas en mesure d'utiliser l' local_ip
méthode à tous.Des idées?
La solution
Vous n'avez pas décrit la manière dont vous essayez d'utiliser la méthode, donc je m'excuse à l'avance si ce sont des choses que vous savez déjà.
Les méthodes sur un module ne viennent jamais en utilisation, à moins que le module est inclus dans une classe.Les méthodes d'Instance d'une classe exige qu'il y ait une instance de la classe.Vous voudrez probablement une méthode de la classe à la place.Et le fichier lui-même devrait être chargé, généralement par l'intermédiaire de l'exiger de déclaration.
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
Ensuite, vous devriez être en mesure de l'exécuter en disant:
require 'getip'
GetIP.local_ip
Autres conseils
require
charger un fichier.Si ce fichier contient toute la classe/module de définitions, puis votre code sera désormais en mesure de les utiliser.Si le fichier contient du code qui n'est pas dans tous les modules, il sera exécutée comme si elle était au même endroit que votre "besoin" d'appel (comme PHP include)
include
est de le faire avec des modules.
Il prend toutes les méthodes dans le 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 ne comprennent, mais au lieu d'ajouter les méthodes exemple méthodes, ajoute comme classe des méthodes, comme ceci:
La remarque ci-dessus, comment, quand je voulais accéder à first_method, j'ai créé un nouvel objet de Orig
classe.C'est ce que je veux dire par la méthode d'instance.
class SecondClass
extend MyModule
end
SecondClass.first_method # will call first_method
Notez que dans cet exemple, je ne suis pas en faire de nouveaux objets, tout en appelant la méthode directement sur la classe, comme si elle avait été définie comme self.first_method
tout au long de.
Donc là vous allez :-)
require
et include
sont deux choses différentes.
require
est strictement charger un fichier à la fois à partir d'un chemin de chargement.Le loadpath est une chaîne de caractères et c'est la clé utilisée pour déterminer si le fichier a déjà été chargé.
include
est utilisé pour "mélanger-dans" modules dans d'autres classes. include
est appelée sur un module et le module de méthodes sont inclus que les méthodes d'instance de 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 de nombreuses fois le module que vous voulez mélanger dans n'est pas dans le même fichier que la classe cible.Afin de vous faire un require 'module_file_name'
et puis à l'intérieur de la classe, vous en faire une include module
.