2013-10-21 8 views
10

私はputとpostのリクエストの違いについて読んでいて、レールに関係するようないくつかの関連する質問があります。既に作成された行の特定のフィールドを変更したいのですが... put要求またはpost要求を使用しますか?たとえば、次のような違いがありますか?Rails Putと投稿

#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 

ありがとうございます。レールの慣例によると、

PUTがPOSTは、レール4では、新しいリソース

を作成するために使用される

、PUTは、混乱を避けるために、PATCHに変更された既存のリソースを更新するために使用される

+0

http://stackoverflow.com/questions/107390/whats-the-difference-between-a-post-and-a-([この]をチェックしてくださいput-http-request)、あなたの質問は、httpの定義とその意図の用法よりも、レールの規則よりも重要です... – rudolph9

答えて

17

RailsはルートがPUTやPOST

+0

私はすべてを理解しています...私の混乱は、2つの重なり合う性質から来ています。すなわち、 POSTリクエストを使用して更新することもできます。私の懸念は、単に一つのフィールドを更新したいのであれば、PUTリクエストは既存のレコードを完全に置き換えるため、変更したいフィールドだけを保持するのではなく、 – kempchee

1

PUTやPOSTのためのアクションがHTTPメソッドで、デフォルトでは以下のように

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"} 

お知らせになります生成しました。

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

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

4

Railsは、デフォルトでREST仕様のレイアウトでHTTP動詞を使用することを目的としているため、同じ操作を実行できる方法については考慮する必要はありません。代わりに、RESTfulでユーザーが理解できるAPIを提供することを検討する必要があります。これらのデフォルト動作は無効にすることができます。

RESTを示している:

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

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

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

Rails 4では、PUT動詞を使用してリソースを更新します。私たちは、レコードのいくつかの属性を更新する際に

  • PUTが実際にリソースまたはすべての彼の属性を「交換」の文脈の中で何かを意味だけでなく、リソース(私はこれを基づかよを作成することを意味可能性がPATCHを使うべきだと思う

  • 2
    • この本を読んで覚えているもの:REST API Design Rulebook )たとえば、AWS S3リソースを移動(コピー)しているときに、PUTで​​はなく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私は真実ですが、いくつかのコアWeb規約に完全に従っているわけではありません。 Railsは生産性を上げようとしており、あまりにも厳しい条約が生産性を押し下げています。だから答えを求めるときに外に出ないでください。真実は、RailsがPUTとPATCHを同じ方法で扱っていることです。明らかに両方が間違っています。だから私はお勧め:新しい、あなたはあなたのコントローラであることを自分自身を見つける場合は、すべての

  • に置か使用していない
  • を表示し、更新
  • にインデックスにGETを
  • PATCHを作成する上

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

    UPDATE

    私は、このトピックの深さに行くこのトピックの2件の記事を書いてきました。

  • +0

    詳細なレスポンスがありますが、その名前にもかかわらずJSON API標準はRailsに関連するバッカーの一部であっても実際は標準*ではありません。現在のオプションを調べようとする質問:正直なところ私はStormpathがこの話でRESTfull JSON APIを提案しているのが好きです。https://stackoverflow.com/questions/12806386/standard-json-api-response-format – prusswan

    +0

    //www.youtube.com/watch?v=hdSrT4yjS1g。私の意見では、JSON API http://jsonapi.org/以上のものが好きです。 JSONAPI.orgの実装では、コンベンション全体のコンベンションを行っています。コミニュティーが何か他のものを使用することに同意するなら、私はそれに同意しますが、標準より半分の標準を持つ方が良いです:) – equivalent8

    +0

    優れたリンク:) – theDrifter

    関連する問題