Rails Put vs Post
我一直在阅读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
提前致谢。
根据铁路公约,
PUT用于更新现有资源
POST用于创建新资源
在导轨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的动作
默认情况下,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动词来更新资源。
围绕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,显然两者都是错误的。 所以我建议:
但是如果你的整个项目在任何地方都使用PUT,那么你不需要经过并改变一切。 只要坚持一个或另一个(PUT或PATCH)。
UPDATE
我已经写了2篇关于这个话题的文章,我深入这个话题。
上一篇: Rails Put vs Post