Ruby命名空间问题

时间:2012-02-20 21:23:06

标签: ruby syntax namespaces

我正在尝试构建一个用于与Yahoo Placemaker API交互的gem,但我遇到了一个问题。当我尝试运行以下代码时,我得到:

NameError: uninitialized constant Yahoo::Placemaker::Net
    from /Users/Kyle/.rvm/gems/ruby-1.9.2-p290/gems/yahoo-placemaker-0.0.1/lib/yahoo-placemaker.rb:17:in `extract'
    from (irb):4
    from /Users/Kyle/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `<main>'

雅虎-placemaker.rb

require "yahoo-placemaker/version"
require 'json'
require 'ostruct'
require 'net/http'

module Yahoo
  module Placemaker
    def self.extract (text = '')
      host = 'wherein.yahooapis.com'
      payload = {
        'documentContent' => text,
        'appid' => APP_ID,
        'outputType' => 'json',
        'documentType' => 'text/plain'
      }

      req = Net::HTTP::Post.new('/v1/document')
      req.body = to_url_params(payload)
      response = Net::HTTP.new(host).start do |http|
        http.request(req)
      end
      json = JSON.parse(response.body)
      Yahoo::Placemaker::Result.new(json)
    end
  end
end

2 个答案:

答案 0 :(得分:2)

我还没弄清楚完全常量名称解析如何在Ruby中运行(我认为这里的规则有点混乱),但根据我的经验,很可能是Net查找当前名称空间而不是全局名称空间。尝试使用完全限定名称:

::Net::HTTP::Post.new

此行中可能会出现类似问题:

Yahoo::Placemaker::Result

您应该将其替换为::Yahoo::Placemaker::Result或更好Result(因为它位于当前命名空间中)。

答案 1 :(得分:0)

尝试之前需要net / http。如果没有定义,Ruby会在模块中找回它。

require 'net/http'