Rails Put 与 Post

Posted

技术标签:

【中文标题】Rails Put 与 Post【英文标题】:Rails Put vs Post 【发布时间】:2013-10-30 12:43:41 【问题描述】:

我一直在阅读 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

提前致谢。

【问题讨论】:

查看this,您的问题与http定义及其预期用途有关,而不是rails约定... 【参考方案1】:

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

【讨论】:

我明白这一切......我的困惑来自两者的重叠性质。 IE。您还可以使用 POST 请求进行更新。我担心的是,如果您只是想更新一个字段,PUT 请求将完全替换现有记录,要求您指定要保持不变的所有字段的值,而不是只指定要更改的字段【参考方案2】:

默认情况下,Rails 旨在以 REST 规范规定的方式使用 HTTP 动词,您不必担心这些方法为什么允许您执行相同的操作。相反,您应该考虑提供一个 RESTful 且用户能够理解的 API。这些默认行为可以被覆盖。

REST 表示:

使用 POST 方法的请求应该作用于资源集合;向集合中添加新资源 示例网址:http://example.com/resources

使用 PUT HTTP 动词的请求应该作用于集合中的单个资源;完全在服务器上替换资源 示例网址:http://example.com/resource/1

使用 PATCH HTTP 动词的请求应该作用于集合中的单个资源;更新其所在资源的某些属性 示例网址:http://example.com/resource/1

Rails 4 现在使用 PATCH 动词而不是 PUT 动词来更新资源。

【讨论】:

【参考方案3】: 我认为我们应该在更新记录的某些属性时使用 PATCH PUT 确实意味着“替换”资源或其所有属性的上下文中的某些内容,但也可能意味着创建资源(我基于我从阅读本书中所记得的内容:REST API Design Rulebook ),例如,当您正在移动(复制)您触发 PUT 而不是 POST 的 AWS S3 资源。所以是的,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 如果您发现自己的控制器正在执行一些奇怪的操作,请尝试重构您的控制器(引入新控制器可能http://jeromedalbert.com/how-dhh-organizes-his-rails-controllers/)

但是,如果您的整个项目到处都在使用 PUT,那么您无需经历并更改所有内容。只需坚持一个或另一个(PUT 或 PATCH)。

更新

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

http://www.eq8.eu/blogs/36-patch-vs-put-and-the-patch-json-syntax-war http://www.eq8.eu/blogs/37-post-create-and-put-updatepost

【讨论】:

一个很好的详细响应,但尽管它的名称 JSON API 标准现在并不是真正的 标准,尽管一些支持者与 Rails 相关联。一个试图检查当前选项的问题:***.com/questions/12806386/… 说实话,我喜欢 Stormpath 公司在这次谈话中提出 RESTfull JSON API youtube.com/watch?v=hdSrT4yjS1g 的方式。在我看来,我比 JSON API jsonapi.org 更喜欢它。但是约定优于配置,我使用 JSONAPI.org 实现。如果社区同意使用其他东西,我会使用它,但有一半标准总比没有标准好:) 我已经用我对此主题的调查的 2 个资源更新了答案。我建议阅读它们。【参考方案4】:

PUT 和 POST 是 HTTP 方法。

在 routes.rb 中你必须映射方法和控制器#action。在您的课程中,您定义了 3 次相同的方法。因此,如果您想将这些操作映射到 HTTP 方法,则不能。

您将更改每个方法的名称并将实现更改为模型类。

【讨论】:

【参考方案5】:

我不是 Rails 人,但我相信这些都是一样的,长话短说:

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

您会看到没有参数的 POST 方法的 url,例如“/api/example”,(因为没有什么可更改的)您只需添加(发布)。 如果您的 URL 包含诸如“/api/example/:id”之类的参数 - 现在这是使用 PUT 方法的合法方式,因为您使用 url 参数,因此您必须找到一些数据并进行更改。

总结: 如果您的 url 没有参数,请使用 POST,否则 - PUT(使用 PUT 方法的请求通常包含数据,比较,如果是 DELETE 方法,则 url 也包含参数,但正文中不包含数据。

【讨论】:

以上是关于Rails Put 与 Post的主要内容,如果未能解决你的问题,请参考以下文章

AFNetworking 使用 Rails 进行 PUT 和删除

[Rails]表单提交时,post与patch的内部转化

[Rails]表单提交时,post与patch的内部转化

Ruby on rails - 更新 ajax 的 PUT 方法

NS-Vue/Rails 对 S3 存储桶的预签名 PUT 请求给出 403

Ajax PUT 请求导致 Rails 应用程序注销。为啥?