2017-11-10 5 views
1

私が持っているjsonから値を取得し、それを別のファイルに入れて他の値も同じものにしたいと思っています。これは私のコードです:なぜ "write":クローズドストリーム(IOError) "

somefile = File.open("employee_info.txt", "w") 
File.open("employee_api_info.txt") do |file| 
    file.each_line do |line| 
    url = URI(line) 
    http = Net::HTTP.new(url.host, url.port) 
    http.use_ssl = true 

    request = Net::HTTP::Get.new(url) 
    request['Accept'] = 'application/vnd.pagerduty+json;version=2' 
    request['Authorization'] = "Token token=#{token.chomp}" 

    response = http.request(request) 
    # puts response.body 

    data=response.body 
    jdoc = JSON.parse(data) 

    somefile.puts "Employee Name: " + jdoc["user"]["name"].gsub(/\w+/, &:capitalize).gsub(/[.]/, ' ') 
    somefile.puts "Employee Email: " + jdoc["user"]["email"] 
    somefile.puts "Time Zone: " + jdoc["user"]["time_zone"] 
somefile.close 

    anotherfile = File.open("employee_phone_api.txt", "w+") 
    jdoc.fetch("user").fetch("contact_methods").each do |contact| 
     anotherfile.puts contact["self"] 
    anotherfile.close 
    end 
    end 
end 

私はそれが常に返さ端子を介してそれを実行すると...

`write': closed stream (IOError) 
    from PagerDutyOncall.rb:93:in `puts' 
    from PagerDutyOncall.rb:93:in `block (2 levels) in <main>' 
    from PagerDutyOncall.rb:92:in `each' 
    from PagerDutyOncall.rb:92:in `block in <main>' 
    from PagerDutyOncall.rb:69:in `open' 
    from PagerDutyOncall.rb:69:in `<main>' 

誰かが私を助けてくださいことはできますか?

+0

ここに93行目はありますか? – tadman

+0

'File.open(...)do | f |'パターンはここでのみ使用してください。ブロックスタイルと非ブロックスタイルを混在させてマッチングさせると、何が起こっているのかがかなり混乱します。 – tadman

+0

anotherfile.puts contact ["self"]は91 –

答えて

1

私はあなたがこの問題を作成したと思います。適切にインデントされたコードは次のとおりです。

anotherfile = File.open("employee_phone_api.txt", "w+") 
jdoc.fetch("user").fetch("contact_methods").each do |contact| 
    anotherfile.puts contact["self"] 
    anotherfile.close 
end 

anotherfile.closeはループ内にあることに注意してください。あなたの問題があります。適切なものをネストすることによって、それを修正:

File.open("employee_phone_api.txt", "w+") do |af| 
    jdoc.fetch("user").fetch("contact_methods").each do |contact| 
    af.puts contact["self"] 
    end 
end 

あなたが最初の場所でこのような問題を避けるのを助けることができ矛盾インデントについての警告を取得する必要がありますruby -wでこれを実行した場合。覚えておいてください:きれいなコードは汚れた誤りをより明白にします

+1

ありがとうございます!私は別のqを持っていますか?それで、それはテキストファイルemployee_api_info.txtの1行だけのためにselfの値を表示しました。どのように私はそれをループするので、私はそのテキスト内のすべての行(API)の値を取得します。明確化が必要な場合は教えてください。 –

+0

心配しないでください!わかった。私はw +をaに変更しなければならなかった。申し訳ありませんが、愚かな間違い。 –

+0

あなたがそれを修正して何かを学んだのであれば、それはばかげていません。お役に立てて嬉しいです。 – tadman

関連する問題