めもめも のーと

ハマったこととか、覚えたこととか

request.body.readの中身が空になる件

rubyでちょっとしたアプリを作っていた時のメモです。

過程は端折りますが、以下のような形で受け取ったリクエストを処理しようと思ったら、どうしても空になってしまいました。。

req = request.body.read
puts #{req} # => ""

結論から言うと、処理の前に、どういうリクエストが来ているのか見るためにputsで中身を出力させていたのですが、これが悪かったようです。 つまり、一度readしてしまうと、次にreadしても中身が空になるようです。

※正確には、とくにreadに引数を指定しないのでファイルポインタがEOFに達するため、空になるようです。詳しくは以下参照。

http://docs.ruby-lang.org/ja/2.0.0/method/IO/i/read.html

これを回避するには、putsのデバッグをやめればいいのですが、どうしてもやめれない場合は、rewindしてあげればよさそうです。

puts #{request.body.read}  # この時点でrequest.bodyを次にreadしても空が返る。
puts #{request.body.read}  # => ""
request.body.rewind
puts #{request.body.read}  # 中身が表示される。

結構ハマりました。。