Добавление функциональности в Rails
-
09-06-2019 - |
Вопрос
Я работаю над приложением Rails и хочу включить в него некоторые функции из "Получение имени хоста или IP в 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
метод вообще.Есть идеи?
Решение
Вы не описали, как пытаетесь использовать этот метод, поэтому заранее извиняюсь, если вы уже знаете об этом.
Методы модуля никогда не используются, если модуль не включен в класс.Методы экземпляра класса требуют наличия экземпляра класса.Вместо этого вам, вероятно, понадобится метод класса.А сам файл должен быть загружен, как правило, через оператор 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
Другие советы
require
загрузит файл.Если этот файл содержит какие-либо определения классов/модулей, то ваш другой код теперь сможет их использовать.Если файл содержит только код, которого нет ни в одном модуле, он будет запущен так, как если бы он находился в том же месте, что и ваш вызов «require» (например, PHP include).
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, но вместо добавления методов как пример методы, добавляет их как сорт методы, например:
Обратите внимание выше: когда я хотел получить доступ к first_method, я создал новый объект Orig
сорт.Вот что я имею в виду под методом экземпляра.
class SecondClass
extend MyModule
end
SecondClass.first_method # will call first_method
Обратите внимание: в этом примере я не создаю никаких новых объектов, а просто вызываю метод непосредственно в классе, как если бы он был определен как self.first_method
все это время.
Так вот :-)
require
и include
это две разные вещи.
require
заключается в строгой загрузке файла один раз по пути загрузки.Путь загрузки представляет собой строку, и это ключ, используемый для определения того, был ли файл уже загружен.
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
.