【Rails】routes.rb でのpostとpatchは何が違う?
Ruby on Railsのroutes.rbではHTTPメソッドを使ってしてroutingを定義することができる。
メソッド | 意味 |
---|---|
GET | リソースの取得 |
POST | 子リソースの作成、リソースへのデータ追加、その他処理 |
PUT | リソースの更新、リソースの作成 |
DELETE | リソースの削除 |
HEAD | リソースのヘッダ (メタデータの取得) |
OPTIONS | リソースがサポートしているメソッドの取得 |
TRACE | プロキシ動作の確認 |
CONNECT | プロキシ動作のトンネル接続への変更 |
引用元:https://qiita.com/r_fukuma/items/a9e8d18467fe3e04068e
ここにはありませんが、routes.rbではこれらのHTTPメソッド + pathでroutingを定義するのですが、ここで問題になるのが...
PUT ? POST? PATCH?
ということ。例えば、userモデルがあって、そのuser.nameを更新したい場合に僕らはどのHTTPメソッドを採用すべきなのでしょうか?
結論からいえば、Rails4以降はPATCHを使うことが推奨されています。
ちなみにそれぞれなにが違うのでしょうか?
メソッド | 安全 | 冪等 |
---|---|---|
GET | ◯ | ◯ |
POST | × | × |
PATCH/PUT | × | ◯ |
DELETE | × | ◯ |
引用元:https://techracho.bpsinc.jp/baba/2014_02_17/15665
まず、「POST」と「PATCH/PUT」は大きくことなります。その違いが「冪等性(べきとうせい)」というもの。端的に言えば、「何度その処理(PUTやPOST)をしても、もとのデータは変わらないこと」を冪等性と言います。
POSTのわかりやすい例はブログ記事の新規作成やGithubのPR(プルリクエスト)をたてる場合です。1度投稿(POST)したあと、もう一度投稿(POST)をすると2つの記事が投稿されます。1度目の結果と2度目の結果が異なります。
一方、PATCH/PUTのわかりやすい例はTwitterのいいね!です。いいね!を外す処理を一旦考えずに、いいね!をつける(PATCH/PUT)を2度するとどうなるでしょうか。いいね!は2つできず、そのままになります。これが冪等性があるということです。
では、PATCHとPUTはなにが違うのでしょうか?
メソッド | 概要 |
---|---|
PUT | 全置き換え |
PATCH |
部分置き換え |
引用元:https://qiita.com/necojackarc/items/fd53c96865d0ef7a02d8
これだけです。対象のリソース、モデルに対してどうやって更新するか?というだけですね。