2014-01-28 128 views
2

我正在开发一个ruby应用程序,该应用程序会根据您的ip地址确定您的位置。尽管我遇到了路障。我已经在这个网站上搜索过,但我已经找到的解决方案太笼统了。未初始化的常量Ruby

这里的错误:

uninitialized constant Place::IpGeocoder (NameError) 

而且我开发的代码:

require 'socket' 
require 'geocoder' 
require 'geokit' 


class Place 

    def get_location 

    ip = UDPSocket.open {|s| s.connect("64.233.187.99", 1); s.addr.last} 
    location = IpGeocoder.geocode(ip.to_s()) 
    end 

end 

me=Place.new 
me.get_location 

我已经安装了宝石。我是否需要在java中创建它的一个实例或类似的东西?

回答

6

您需要按照以下文档Geokit::Geocoders::IpGeocoder进行操作。

Geokit::Geocoders::IpGeocoder.geocode(ip.to_s()) 

IpGeocoder在模块内部Geokit::Geocoders定义。所以要访问该类,您需要使用该类的完整路径,即Geokit::Geocoders::IpGeocoder,使用范围解析运算符::

+0

哦好吧,我现在看到的,所以如果我是做类似的soltion到http://stackoverflow.com/questions/4889599/rails-how-to-get-latitude-and-longitude-from-string-address把它放在谷歌它会是正确的相同的事情。随着包括和MultiGeocoder –

+0

@CalvinJones尝试通过你的自我.. :)尝试和学习.. –

+0

我没有和得到了同样的错误,但由于 –

2

它被称为命名空间。基本上你所做的是试图访问IpGeocoder常数位于您Place类。除非你没有在那里定义一个常数。你必须告诉红宝石在那里给它一个方向来定位IpGeocoder不变。 (澄清:Ruby中的类名是常数)

的类和方法在源代码中这样很可能宣告:

module Geokit 
    module Geocoders 
    class IpGeocoder 
    def geocode(ip) 
    end 
    end 
end 

正如你可以在这里看到,引用方法在IpGeocoder类,你需要通过这种方式告诉你的班级去实现它。奥雅纳简洁地描述了这一点。

+0

好,谢谢这么对于很多现在澄清了我完全理解这个概念,现在又神保佑你,先生感谢您的帮助 –

相关问题