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 和删除
Ruby on rails - 更新 ajax 的 PUT 方法