PIYO - Tech & Life -

ブラウザからPATCHメソッドのリクエストが飛ばないときは

Web IE

tl;dr

プロキシサーバーでPATCHがブロックされているかもしれないから、PUTに切り替えたら動いたよ。

経緯

仕事で開発しているRailsアプリケーションでのできごとです。あるお客さんの社内のPCのIEから、あるデータを一部修正するするためのボタンが動かない、という連絡をもらいました。ユーザーのステータスを更新する機能のようなものというイメージを持ってもらえたらいいです。

この機能はボタンを押したらAjax的にリクエストを投げて戻ってきたら画面を更新するということをやっていました。最初はIEを疑いましたが、同様にAjaxな削除ボタンは動くらしくIEのせいではないことがわかりました

次に調べたのはRails側のログですが、該当のリクエストに相当するログが一切なかったのでサーバーにリクエストが到達していないことがわかりました。

いくつか似たような機能のうち動かないものを列挙してもらったところ、それらの共通点として全てがPATCHメソッドのリクエストを投げていることがわかりました。

Railsではリソースのupdateアクションに対応するメソッドはPUTまたはPATCHです。一部更新というような機能の際はPATCHを使うようにしていました。

この辺の話題は同僚の@tkawaさんがだいぶ前に書いてくれてます。

次期RailsがPATCHメソッドを採用 - ぶろぐ。@はてな
先月、Railsのブログにこんな記事が載りました。 http://weblog.rubyonrails.org/2012/2/25/edge-rails-patch-is-the-new-primary-http-method-for-updates/ なぜか当初とURLが変わっているようで、ブックマークは Edge Rails: PATCH is the new primary HTTP method for updates | Riding Rails のほうが多いです。(たしかこっちはブログのコメントもいっぱいついてたと思うんだが消えている…)これは簡単に言うと、 window.twtt…

まずは一箇所だけPATCH→PUTと変更してみたところ、該当部分が動くようになったことがわかり、やはりPATCHが原因だったことがわかりました。

どうやらそのPCは外部へのアクセスが厳し目の設定になっているらしいです。原因が完全にはわかっていないものの、プロキシサーバーあたりが怪しいと推測するに至りました。

結論

環境によってはPATCHを使わないほうが良い。