关于http:Rails Put vs Post

Rails Put vs Post

我一直在阅读Put和Post请求之间的区别,我有一些与Rails相关的问题:我想在已经创建的行中更改一个特定字段…我应该使用Put还是Post请求?例如,以下是不同的?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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用于创建新资源

在Rails 4中,Put已更改为Patch以避免混淆。

默认情况下,Rails生成的路由如下所示

1
2
3
4
5
6
7
    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。可以覆盖这些默认行为。

休息表示:

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

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

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

现在,Rails4使用patch动词而不是put动词来更新资源。


  • 我认为我们应该在更新记录的某些属性时使用修补程序
  • Put实际上是指在"替换"资源或其所有属性的上下文中的某个内容,但也可能意味着创建一个资源(我是根据我在阅读本书时所记得的:RESTAPI设计规则手册,例如,当您移动(复制)AWS S3资源时,您触发的是Put Not Post。所以是的,Put让人困惑。
  • 提交新资源时应使用日志

关于补丁也有很多困惑,我个人同意JSONAPI标准建议如何执行http://json api.org/format/crud更新:

1
2
3
4
5
6
7
8
9
10
11
12
13
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
  • 如果你发现你的控制器在做一些奇怪的动作,试着重组你的控制器(引入新的控制器,可能是http://jeromedalbert.com/how-dhh-organizes-his-rails-controllers/)

但是,如果整个项目都在使用Put-Everywhere,则不需要经历并更改所有内容。只需坚持一个或另一个(放置或修补)。

更新

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

  • 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


Put和Post是HTTP方法。

在routes.rb中,您必须映射方法和控制器动作。在类中,定义的方法是同一方法的3倍。因此,如果要将这些操作映射到HTTP方法,则不能。

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