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} # 中身が表示される。
結構ハマりました。。