未初始化的常量Ruby

时间:2014-01-28 22:30:35

标签: ruby

我正在开发一个ruby应用程序,根据您的IP地址确定您的位置。我遇到了路障。我已经在这个网站上搜索过了,但我已经找到的解决方案太过一般了。

这是错误:

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的实例?

2 个答案:

答案 0 :(得分:6)

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

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

IpGeocoder在模块Geokit::Geocoders内定义。因此,要访问该类,您需要使用范围分辨率运算符Geokit::Geocoders::IpGeocoder的{​​{1}}类的完整路径。

答案 1 :(得分:2)

它叫做命名空间。基本上你所做的是尝试访问位于IpGeocoder类中的Place常量。除了你没有在那里定义一个常数。你必须告诉ruby在哪里找到IpGeocoder常数,给它一个方向。 (澄清:在ruby类名称中是常量)

类和方法可能在源代码中声明如下:

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

正如您在此处所见,要在IpGeocoder课程中引用该方法,您需要告诉您的课程如何实现它。奥雅纳简洁地描述了这一点。