2017-04-01 4 views
0

私はCLIプロジェクトに取り組んでおり、別の方法で宣言されたurl変数を使ってウェブページを開こうとしています。ある方法で宣言された変数を別の方法でウェブページを開くために使用する

def self.open_deal_page(input) 
    index = input.to_i - 1 
    @deals = PopularDeals::NewDeals.new_deals 
    @deals.each do |info| 
    d = info[index] 
    @product_url = "#{d.url}" 
    end 
    @product_url.to_s 
    puts "They got me!" 
end 

def self.deal_page(product_url) 
    #self.open_deal_page(input) 
    deal = {} 
    html = Nokogiri::HTML(open(@product_url)) 
    doc = Nokogiri::HTML(html) 
    deal[:name] = doc.css(".dealTitle h1").text.strip 
    deal[:discription] = doc.css(".textDescription").text.strip 
    deal[:purchase] = doc.css("div a.button").attribute("href") 
    deal 
    #binding.pry 
end 

このエラーが表示されます。

`open': no implicit conversion of nil into String (TypeError) 

可能な解決策はありますか?事前にありがとうございます。

+0

「x」ではなく「self.x」として宣言しているのは、インスタンスメソッドではなくクラスメソッドになっているので、奇妙です。このようなコンポーネントを設計するときは、通常、これらをインスタンスメソッドにして、 '@ deals'のようなインスタンス変数を問題のインスタンスに対してローカルにします。これらが単なるスタンドアローンのメソッドであれば、 'self.'プレフィックスの理由はありませんが、' @ 'スタイルのインスタンス変数の使用も避けるべきです。代わりに、必要な変数をメソッドの引数として渡します。あなたはすでにこれをやっていますが、変数を間違って参照しています。 – tadman

+1

@tadmanご意見ありがとうございました。 –

答えて

1

ので、それは以前のようにそれを作成してみてください、それからはアクセスできません、今あなたがputs "They got me!"を返しているので、あなたのopen_deal_pageメソッド内でご@product_urlを返してみて、またあなたのproduct_urlがあなたのeachブロック内に作成されていることに注意してください空の場合はstringとし、それを返すことができます。あなたのdeal_page方法で

def open_deal_page(input) 
    ... 
    # Create the variable 
    product_url = '' 
    # Assign it the value 
    deals.each do |info| 
    product_url = "#{info[index].url}" 
    end 
    # And return it 
    product_url 
end 

あなたが引数として渡しているproduct_urlを開くには鋸山に伝えます。

def deal_page(product_url) 
    ... 
    html = Nokogiri::HTML(open(product_url)) 
    ... 
end 
+0

ありがとう!それは今働きます! –

+0

よろしくお願いします。 –

関連する問題