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
  • PUT确实意味着“替换”资源或其所有属性的上下文,但也可能意味着创建资源(我基于我在阅读本书时所记得的内容: REST API设计规则手册 ),例如当你移动时(复制)您正在触发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 I但事实上它并不完全遵循一些核心Web约定。 Rails试图提高效率,而过于严格的惯例则会降低生产力。 因此,在寻求答案时不要过火。 事实是,Rails以同样的方式处理PUT和PATCH,显然两者都是错误的。 所以我建议:

  • POST上创建
  • PATCH更新
  • 获取索引,新增,显示
  • 根本不要使用PUT
  • 如果你发现你的控制器正在做一些奇怪的动作,试着重组你的控制器(引入新的控制器可能http://jeromedalbert.com/how-dhh-organizes-his-rails-controllers/ )

但是如果你的整个项目在任何地方使用PUT,你就不需要经历并改变一切。 只需坚持一个或另一个(PUT或PATCH)。

UPDATE

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

PUT和POST是HTTP方法。

在routes.rb中,您必须映射方法和控制器#action。 在您的class级中,您定义相同方法的3倍。 因此,如果您希望将这些操作映射到HTTP方法,则不能。

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