Rails

2008-09-05 17 views
2

için işlevsellik ekleme Rails uygulaması üzerinde çalışıyorum ve "Getting the Hostname or IP in Ruby on Rails" dan istediğim bazı işlevleri dahil etmek istiyorum.Rails

Çalışmak için sorun yaşıyorum. Ben sadece lib dizininde bir dosya yapmalıdır izlenimi altında, bu yüzden içeriğiyle 'get_ip.rb' adını verdi:

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 

Ben de bir sınıf olarak GetIP tanımlayan çalışmıştı ama ben Her zamanki gibi ruby script/console, local_ip yöntemini kullanamıyorum. Herhangi bir fikir?

cevap

4

Yöntemi nasıl kullanmaya çalıştığınızı açıklamıyorsunuz, bu nedenle önceden bildiğiniz bir şey varsa şimdiden özür dilerim.

Bir modüldeki yöntemler, modül bir sınıfa dahil olmadıkça asla kullanılmaz. Bir sınıftaki örnek yöntemleri, sınıfın bir örneği olmasını gerektirir. Muhtemelen bunun yerine bir sınıf yöntemi istiyorsunuz. Ve dosyanın kendisi genellikle gereksinim ifadesiyle yüklenmelidir.

şu kod dosyası getip.rb ise

,
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 

Sonra diyerek çalıştırmak mümkün olmalıdır,

require 'getip' 
GetIP.local_ip 
5

require bir dosya yükleyecektir. Bu dosya herhangi bir sınıf/modül tanımı içeriyorsa, diğer kodunuz artık bunları kullanabilir. Dosya sadece herhangi bir modülde olmayan bir kod içeriyorsa, '' gerektirir '' çağrısı (PHP dahil) ile aynı yerde olsaydı koşar gibi çalışır.

include modüller ile ilgilidir.

Tüm yöntemleri modülde alır ve bunları sınıfınıza ekler. Şunun gibi:

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. 

da yapar, ancak bunun yerine örneği olarak yöntemleri yöntemleri ekleme dahil gibi çalışır extend yok, böyle, sınıf olarak yöntemleri ekler:

Not Yukarıdaki nasıl first_method adresine erişmek istediğimde, Orig sınıfının yeni bir nesnesini yarattım. Örnek yöntemle kastediyorum. Bu örnekte ben, herhangi bir yeni nesneler yapmıyorum hepsi birlikte self.first_method olarak tanımlanmıştır sanki sadece sınıfa doğrudan yöntemini çağırarak bu

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

Not.

Yani orada

0

require ve include farklı şeylerdir :-) gidin. Bir yükleme yolundan bir kez bir dosyayı kesinlikle yüklemek için

. Loadpath bir dizedir ve dosyanın önceden yüklenmiş olup olmadığını belirlemek için kullanılan anahtardır. Modüllerin diğer sınıflara "karıştırılması" için

include.Bir modülde include çağrılır ve modül yöntemleri sınıfta örnek yöntemleri olarak eklenir.

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 

Ancak, karıştırmak istediğiniz modülün çoğu kez hedef sınıfla aynı dosyada değil. Yani bir require 'module_file_name' yapıyorsunuz ve sonra sınıfın içinde bir include module yapıyorsunuz.