NameError:未初始化的常量:: Nokogiri

时间:2012-09-17 15:48:28

标签: ruby-on-rails ruby rspec nokogiri

我为模型写了测试:

describe Video do
  describe 'searching youtube for video existence' do
    it 'should return true if video exists' do
      Video.video_exists?("http://www.youtube.com/watch?v=KgfdlZuVz7I").should be_true
    end
  end  
end

以下是型号代码:

class Video < ActiveRecord::Base
  attr_accessible :video_id

  def self.video_exists?(video_url)
    video_url =~ /\?v=(.*?)&/
    xmlfeed = Nokogiri::HTML(open("http://gdata.youtube.com/feeds/api/videos?q=#{$1}"))
    if xmlfeed.at_xpath("//openSearch:totalResults").content.to_i == 0
      return false
    else
      return true
    end
  end
end

但它失败了,错误:

Failures:

  1) Video searching youtube for video existence should return true if video exists
     Failure/Error: Video.video_exists?("http://www.youtube.com/watch?v=KgfdlZuVz7I").should be_true
     NameError:
       uninitialized constant Video::Nokogiri
     # ./app/models/video.rb:6:in `video_exists?'
     # ./spec/models/video_spec.rb:6:in `block (3 levels) in <top (required)>'

Finished in 0.00386 seconds
1 example, 1 failure

我不知道如何解决这个问题,可能会出现什么问题?

2 个答案:

答案 0 :(得分:10)

问题是因为我没有将gem nokogiri添加到Gemfile。

添加后,我从模型中删除了require 'nokogiri'require 'open-uri',但它确实有效。

答案 1 :(得分:3)

听起来你不需要Nokogiri,所以你需要这样做。

uninitialized constant Video::Nokogiri

是赠品。 Ruby知道“Nokogiri”是一个常量,但不知道在哪里找到它。

在您的代码中,Nokogiri依靠Open-URI来检索内容,因此您还需要require 'open-uri'。 Nokogiri读取Open-URI的open返回的文件句柄。

本节可以更简洁地写出:

if xmlfeed.at_xpath("//openSearch:totalResults").content.to_i == 0
  return false
else
  return true
end

为:

!(xmlfeed.at_xpath("//openSearch:totalResults").content.to_i == 0)

或:

!(xmlfeed.at("//openSearch:totalResults").content.to_i == 0)