【Rails】routes.rb でのpostとpatchは何が違う?

f:id:ShowGoTagami:20191104140241p:plain

 

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

 

これだけです。対象のリソース、モデルに対してどうやって更新するか?というだけですね。