2017-05-30 18 views
0

自分のプログラムをbinフォルダからローカルに実行しています。これはほんの小さなCLIプロジェクトです。私は文字列を取り除いて配列にプッシュしようとしています。任意の提案が高く評価されている文字列を切り取って配列に挿入する

block in scrape_places': undefined method `<<' for nil:NilClass (NoMethodError) 

:私は私のプログラムを実行すると、私はエラーを取得する

require 'nokogiri' 
require 'open-uri' 

module BestPlaces 
    class Places 
    attr_accessor :name, :population, :places 

     def initialize 
     @places = [] 
     end 

     def self.scrape_places 
     doc = Nokogiri::HTML(open("https://nomadlist.com/best-cities-to-live")) 
     places = doc.search("div.text h2.itemName") 
     ranks = doc.search("div.rank") 
     places.each{|e| @places << e.text.strip} 

      @places.each do |place| 
      i = @places.index(place) 
      puts "#{ranks[i].text}. #{place}" 
     end 
     end 
    end 

    class CLI 
     def list_places 
     puts "Welcome to the best places on Earth!" 
     BestPlaces::Places.scrape_places 
     end 

     def call 
     list_places 
     menu 
     goodbye 
     end 
    end 
    end 

は、ここに私のコードです。

要するに

答えて

2

:あなたは@places変数クラスのインスタンスを操作しようとしているので、あなたは、undefined method '<<' for nil:NilClass持って、それは価値があるnilです。

方法initializeにおける最初の@placesは、オブジェクトインスタンス変数であり、あなたが[]にその値を設定するが、クラスメソッドself.scrape_placesにおける第1 @placesクラスインスタンス変数であり、そう、そこに任意の値を与えるdid'tそれはデフォルトではゼロです。 の2つの変数が同じではないことに注意してください。あなたは同じだと思っているので、def self.scrape_placesからdef scrape_placesに変更したい場合は、同じオブジェクトインスタンス変数になります。

も参照:フィードバックや記事の

Ruby class instance variable vs. class variable

+0

感謝を! – schall

関連する問題