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方法,则不能。
您将更改每个方法的名称,并将实现更改为模型类。