我一直在阅读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
提前致谢。
答案 0 :(得分:18)
根据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 :(得分:5)
默认情况下,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现在使用PUT动词上的PATCH动词来更新资源。
答案 2 :(得分:2)
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)。
更新
我已经写了2篇关于这个主题的文章,我将深入探讨这个主题。
答案 3 :(得分:1)
PUT和POST是HTTP方法。
在routes.rb中,您必须映射方法和控制器#action。在您的班级中,您定义相同方法的3倍。因此,如果您希望将这些操作映射到HTTP方法,则不能。
您将更改每个方法的名称并将实现更改为模型类。
答案 4 :(得分:1)
PUT请求用于更新内容,POST请求用于创建或发布新内容。
因此,您要更改已创建的行中的一个特定字段,然后使用以下代码
app / controllers / model_controller.rb
def update
@model = Model.find(params[:id])
@model.update(model_params)
end
答案 5 :(得分:0)
我不是 Rails 人,但我相信这些在任何地方都是一样的,长话短说:
PUT 和 POST HTTP 方法有什么区别?
总结: 如果你的url没有参数,使用POST,否则-PUT(PUT方法的请求通常包含数据,比较,如果是DELETE方法,url也包含参数,但正文中不包含数据。