素の HTML form では GET と POST リクエストしか送信できない。PUT, PATCH, DELETE のような HTTP メソッドをリクエストするには、サーバーサイドで適当に解釈してあげる必要がある。

 例えば Rails の場合、 form_with ヘルパーで編集画面の form タグを生成すると、こうなっている。

<form action="/posts/1" accept-charset="UTF-8" method="post">
  <input type="hidden" name="_method" value="patch" />
  ...
  <input type="submit" valud="Submit" />
</form>

 見ての通り、 form は method="post" を指定している。そしてその内側で _method=patch が指示されている。要するにこれは第一にPOSTとしてリクエストされた上で、サーバーサイドでPATCHリクエストとして解釈され、実行される。

 思えば初学者の頃にも同じ発見をした気がする。しかしそれもすっかり忘れて form から直接 PUT を送信しようとしていた自分がいたのも事実。

 フレームワークや JavaScript に頼っていて、こうした基本的な仕様をかえって意識しないようになっていたようである。まあ、調べればすぐにわかることではあるが、誤った先入観を持っていた自分に気づいてハッと目が覚めた体験として、記憶することにする。