Rails Put与Post的区别

15

我一直在研究PUT请求和POST请求的区别,并且就Rails相关问题有一些疑问:我想更改已经创建的一行中的一个特定字段...我应该使用PUT请求还是POST请求?例如,以下两种请求是否不同?

#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

提前致谢。


看看这个,你的问题更多地涉及到HTTP定义及其预期用法,而不是Rails约定... - rudolph9
5个回答

23
根据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的操作


1
我理解所有这些……我的困惑来自于两者的重叠性质。也就是说,您还可以使用POST请求进行更新。我的担忧是,如果您只想更新一个字段,PUT请求将完全替换现有记录,需要指定要保持相同的所有字段的值,而不仅仅是要更改的字段。 - kempchee

6
Rails默认使用REST规范中的HTTP动词,您不必担心这些方法为什么允许您执行相同的操作。相反,您应该考虑提供一个符合REST规范且用户易于理解的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现在使用PATCH动词来更新资源,而不是PUT动词。

4
  • 我认为在更新记录的某些属性时应该使用PATCH。
  • PUT实际上在“替换”资源或其所有属性的情况下确实意味着一些东西,但也可能意味着创建资源(我基于阅读这本书时记住的内容:REST API Design Rulebook),例如,当您移动(复制)AWS S3资源时,您会触发PUT而不是POST。所以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视为相同,显然都是错误的。所以我建议:

但是,如果你的整个项目都在任意使用PUT,那么你不需要去更改所有的内容。只需坚持使用其中之一(PUT或PATCH)。

更新

我已经写了两篇关于这个主题的文章,深入探讨了这个主题。


这是一个详细的回答,但尽管它的名字是JSON API标准,但现在它并不是真正的*标准,尽管一些支持者与Rails有关。这是一个试图检查当前选项的问题:https://dev59.com/Nmcs5IYBdhLWcg3wfEHa - prusswan
说实话,我喜欢Stormpath公司在这个演讲中提出的RESTful JSON API的方式,链接为https://www.youtube.com/watch?v=hdSrT4yjS1g。在我看来,我比JSON API http://jsonapi.org/更喜欢它。但是惯例优于配置,我会选择JSONAPI.org的实现。如果社区同意使用其他东西,我会接受,但最好有半个标准,而不是没有标准 :) - equivalent8
我已经更新了答案,并提供了两个我在这个主题上调查的资源。我建议阅读它们。 - equivalent8

1

PUT和POST是HTTP方法。

在routes.rb中,您需要映射方法和controller#action。在您的类中,您定义了3次相同的方法。因此,如果您想将这些操作映射到HTTP方法,则无法这样做。

您需要更改每个方法的名称并更改其实现方式以适用于模型类。


0

我不是Rails的专家,但我相信这些方法在任何地方都是一样的,所以长话短说:

PUT和POST HTTP方法有什么区别?

  • 你会看到没有参数的POST方法的URL,比如'/api/example'(因为没有什么需要改变的),你只是添加(发布)。
  • 如果你的URL包含参数,比如'/api/example/:id' - 那么使用PUT方法就是合法的,因为你使用了URL参数,因此你必须找到一些数据并进行更改。

总之: 如果你的URL没有参数,使用POST,否则使用PUT(使用PUT方法的请求通常包含数据,在删除方法的情况下,URL也包含参数,但不包含主体数据)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接