2017-01-28 14 views
1

時々エラーが発生します。ここでは基本的なプログラムがあります:未定義のメソッド[]をnilに修正する方法:OpenUriのNilClass

require 'open-uri' 
require 'json' 
require 'date' 
require 'time' 

def update_wu 
    open("http://api.wunderground.com/api/.......12.json") {|wu| 
    json_string = wu.read 

    upd_str = .... 
     ... 
    wu.close 
    return upd_str 
    } 
    return "NULL" 
end 

loop do 
    upd_str = update_wu 

    # every 5 minutes 
    t = Time.now 
    secs = (t.hour * 60 + t.min) * 60 + t.sec 
    wait = ((secs/(5*60)).to_i + 1) * 5 * 60 - secs 
    print "#{Time.now.inspect} #{upd_str} #{wait}\n" 

    sleep(wait) 
end 

ここでエラーです:

wu.rb:12:in `block in update_wu': undefined method `[]' for nil:NilClass (NoMethodError) 
    from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:155:in `open_uri' 
    from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:717:in `open' 
    from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:35:in `open' 
    from wu.rb:8:in `update_wu' 

プログラムは5分ごとにループして、URIの呼び出しを行います。それはエラーが発生する前に数十回ループします。

どうしたのですか?

+1

ようこそスタックオーバーフロー。 「[mcve]」をお読みください。あなたがコードの一部を削除して構文エラーを引き起こし、あなたの質問をトピックから外すので、あなたのコードは実行されません。それをしないでください。コードを実行して問題を再現できるようにする必要があります。私たちがそれを再現できないなら、あなたを助けることはできません。 –

+0

あなたの「スリープ」メカニズムは不必要に複雑です。 'Time.now.to_i'は秒を返します。 '%'はモジュラを実行します。 'sleep 300 - (Time.now.to_i%300)'は5分ごとに目覚めます。 –

+0

"wu.rb:12"は、問題が12行目に表示されることを示します。この行は表示されません。 –

答えて

1

これは私が現場で5分ごとに見て、JSON応答を解析するために使用したい基本的なコードです:

require 'json' 
require 'open-uri' 
require 'time' 

INTERVAL = 5 * 60 

loop do 
    data = JSON[open("http://httpbin.org/headers").read] 
    puts data 

    delay = INTERVAL - (Time.now.to_i % INTERVAL) 
    puts "Waiting #{delay} seconds" 

    sleep(delay) 
end 

はしかしことをしないでください。変更されていないため結果を取得する必要がないときにサイトにアクセスすると、インターネット上でのマナーが悪くなり、禁止される可能性があります。

代わりに、リソース全体を要求する前にデータを取得する必要があるかどうかを確認する必要があります。通常、HEADリクエストを送信して必要なデータをサイトに渡し、データが変更されているかどうかを確認し、GETまたはPOSTを発行します。詳細については、RFCを参照してください。

The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. The metainformation contained in the HTTP headers in response to a HEAD request SHOULD be identical to the information sent in response to a GET request. This method can be used for obtaining metainformation about the entity implied by the request without transferring the entity-body itself. This method is often used for testing hypertext links for validity, accessibility, and recent modification.

これを行う方法は、それを把握することです。そこに多くの例があります。

接続できない場合は例外が発生します。あなたはそれを救いたいでしょう。

関連する問題