【问题标题】:Rails Put vs PostRails Put 与 Post
【发布时间】:2013-10-30 12:43:41
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 查看this,您的问题与http定义及其预期用途有关,而不是rails约定...

标签: ruby-on-rails http post put


【解决方案1】:

根据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 的操作

【讨论】:

  • 我明白这一切......我的困惑来自两者的重叠性质。 IE。您还可以使用 POST 请求进行更新。我担心的是,如果您只是想更新一个字段,PUT 请求将完全替换现有记录,要求您指定要保持不变的所有字段的值,而不是只指定要更改的字段
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    • 我认为我们应该在更新记录的某些属性时使用 PATCH
    • PUT 确实意味着“替换”资源或其所有属性的上下文中的某些内容,但也可能意味着创建资源(我基于我从阅读本书中所记得的内容:REST API Design Rulebook ),例如,当您正在移动(复制)您触发 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 篇关于这个主题的文章,我深入探讨了这个主题。

    【讨论】:

    • 一个很好的详细响应,但尽管它的名称 JSON API 标准现在并不是真正的 标准,尽管一些支持者与 Rails 相关联。一个试图检查当前选项的问题:stackoverflow.com/questions/12806386/…
    • 说实话,我喜欢 Stormpath 公司在这次谈话中提出 RESTfull JSON API youtube.com/watch?v=hdSrT4yjS1g 的方式。在我看来,我比 JSON API jsonapi.org 更喜欢它。但是约定优于配置,我使用 JSONAPI.org 实现。如果社区同意使用其他东西,我会使用它,但有一半标准总比没有标准好:)
    • 我已经用我对此主题的调查的 2 个资源更新了答案。我建议阅读它们。
    【解决方案4】:

    PUT 和 POST 是 HTTP 方法。

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

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

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2010-10-21
        • 2011-01-02
        • 2011-04-29
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多