14

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

提前致谢。

4

5 回答 5

22

根据 Rails 惯例,

PUT is used for updating an existing resource

POST is used for creating a new resource

In rails 4, PUT has been changed to PATCH to avoid confusion.

Rails generated routes will look like below by default

    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"}

Notice the action for PUT and POST

于 2013-10-21T20:55:18.747 回答
6

默认情况下,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 现在使用 PATCH 动词而不是 PUT 动词来更新资源。

于 2014-05-28T07:02:31.770 回答
4
  • 我认为我们应该在更新记录的某些属性时使用 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,但事实是它并不完全遵循一些核心 Web 约定。Rails 正在努力提高生产力,而过于严格的约定正在抑制生产力。因此,在寻求答案时不要过火。事实上,Rails 对 PUT 和 PATCH 的处理方式相同,显然两者都是错误的。所以我推荐:

但是,如果您的整个项目到处都在使用 PUT,那么您无需经历并更改所有内容。只需坚持一个或另一个(PUT 或 PATCH)。

更新

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

于 2016-03-08T12:32:11.393 回答
1

PUT 和 POST 是 HTTP 方法。

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

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

于 2013-10-21T21:01:08.983 回答
0

我不是 Rails 人,但我相信到处都是一样的,长话短说:

PUT 和 POST HTTP 方法有什么区别?

  • 您会看到没有参数的 POST 方法的 url,例如“/api/example”,(因为没有什么可更改的)您只是添加(发布)。
  • 如果您的 URL 包含像 '/api/example/:id' 这样的参数 - 现在这是使用 PUT 方法的合法方式,因为您使用 url 参数,因此您必须找到一些数据并更改它。

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

于 2021-04-11T19:30:00.607 回答