web-dev-qa-db-ja.com

Railsプットvsポスト

私はプットリクエストとポストリクエストの違いを読んでいますが、Railsに関連するいくつかの関連する質問があります:すでに作成された行の特定のフィールドを変更したい...プットまたはポストリクエストを使用する必要があります?たとえば、次の違いはありますか?

#Assume this is a put request
def update
    @model=Model.find(x)
    @model.field="new_field"
    @model.save
end

#Assume this is a post request
def update
    @model=Model.find(x)
    @model.field="new_field"
    @model.save
end

#What if I use the Rails update method?
def update
    @model=Model.find(x)
    @model.update(model_params)
    @model.save
end

前もって感謝します。

13
kempchee

Rails規則によると、

PUTは、既存のリソースを更新するために使用されます

POSTは、新しいリソースの作成に使用されます

Rails 4)では、混乱を避けるためにPUTがPATCHに変更されました。

Railsで生成されたルートは、デフォルトで次のようになります

    posts GET    /posts(.:format)                            {:action=>"index", :controller=>"posts"}
          POST   /posts(.:format)                            {:action=>"create", :controller=>"posts"}
 new_post GET    /posts/new(.:format)                        {:action=>"new", :controller=>"posts"}
edit_post GET    /posts/:id/edit(.:format)                   {:action=>"edit", :controller=>"posts"}
     post GET    /posts/:id(.:format)                        {:action=>"show", :controller=>"posts"}
          PUT    /posts/:id(.:format)                        {:action=>"update", :controller=>"posts"}
          DELETE /posts/:id(.:format)                        {:action=>"destroy", :controller=>"posts"}

PUTとPOSTのアクションに注意してください

21
usha

Railsはデフォルトで、REST仕様で規定されている方法でHTTP動詞を使用することを目的としています。メソッドで同じアクションを実行できる理由について心配する必要はありません。代わりに、 RESTfulでユーザーが理解できるAPIを提供することを検討してください。これらのデフォルトの動作はオーバーライドできます。

RESTは、次のことを示します。

POSTメソッドを使用したリクエストは、リソースコレクションに作用する必要があります。コレクションに新しいリソースを追加します。例のURL: http://example.com/resources

PUT HTTP動詞を使用するリクエストは、コレクション内の単一のリソースに作用する必要があります。サーバー上でリソース全体を置き換えるURLの例: http://example.com/resource/1

PATCH HTTP動詞を使用したリクエストは、コレクション内の単一のリソースに作用する必要があります。それが立っているリソースの特定の属性を更新するURLの例: http://example.com/resource/1

Rails 4は、リソースを更新するためにPUT動詞よりもPATCH動詞を利用するようになりました。

5
Keith Richards
  • レコードのいくつかの属性を更新するときは、PATCHを使用する必要があると思います
  • PUTは、実際には、リソースまたはそのすべての属性を「置き換える」というコンテキストの中で何かを意味しますが、リソースを作成することも意味します(これは、この本を読んで覚えていることに基づいています: REST APIデザインルールブック ) 、たとえば、AWS S3リソースを移動(コピー)する場合、POSTではなくPUTをトリガーします。そうそう、PUTは混乱しています。
  • 新しいリソースを送信するときは、POSTを使用する必要があります

PATCHについても多くの混乱がありますが、JSON API標準がそれをどのように提案しているかに個人的に同意します http://jsonapi.org/format/#crud-updating

PATCH /articles/1 HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json

{
  "data": {
    "type": "articles",
    "id": "1",
    "attributes": {
      "title": "To TDD or Not"
    }
  }
}

私はRails Iが大好きですが、実際には、いくつかのコアWeb規則に完全には準拠していません。Railsは生産性を高めようとしており、規則が厳しすぎると生産性が低下します。したがって、これに対する答えを探すときにやりすぎないでください。真実は、RailsはPUTとPATCHを同じように扱っており、明らかに両方が間違っているということです。

  • 作成時にPOST
  • 更新時のパッチ
  • インデックス、新規、表示でGET
  • pUTをまったく使用しないでください
  • コントローラーが奇妙なアクションを実行していることに気付いた場合は、コントローラーを再構築してみてください(新しいコントローラーを導入するかもしれません http://jeromedalbert.com/how-dhh-organizes-his-Rails-controllers/

ただし、プロジェクト全体でPUTをどこでも使用している場合は、すべてを調べて変更する必要はありません。どちらか一方(PUTまたはPATCH)に固執するだけです。

[〜#〜]更新[〜#〜]

私はこのトピックについて2つの記事を書き、このトピックについて詳しく説明します。

3
equivalent8

PUTとPOSTはHTTPメソッドです。

Routers.rbで、methodとcontroller#actionをマップする必要があります。クラスでは、同じメソッドを3回定義します。したがって、これらのアクションをHTTPメソッドにマップする場合は、できません。

各メソッドの名前を変更し、実装をモデルクラスに変更します。

1
gzfrancisco