Rails Put vs Post

时间:2013-10-21 20:50:57

标签: ruby-on-rails http post put

我一直在阅读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

提前致谢。

6 个答案:

答案 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
  • PUT确实意味着“替换”资源或其所有属性的上下文,但也可能意味着创建资源(我基于我在阅读本书时所记得的内容:REST API Design Rulebook ),例如当您移动(复制)AWS S3资源时,您正在触发PUT而不是POST。所以是的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,显然两者都是错误的。所以我建议:

但如果你的整个项目到处使用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 方法有什么区别?

  • 你会看到没有参数的 POST 方法的 url,比如“/api/example”,(因为没有什么可以改变)你只是添加(发布)。
  • 如果您的 URL 包含诸如“/api/example/:id”之类的参数 - 现在这是使用 PUT 方法的合法方式,因为您使用的是 url 参数,因此您必须找到一些数据并对其进行更改。

总结: 如果你的url没有参数,使用POST,否则-PUT(PUT方法的请求通常包含数据,比较,如果是DELETE方法,url也包含参数,但正文中不包含数据。