[Rails]表单提交时,post与patch的内部转化

Posted z354681250

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Rails]表单提交时,post与patch的内部转化相关的知识,希望对你有一定的参考价值。

在route.rb中,写下resourses :adminuser后,routes match产生了如下内容:

update和creat同样作为表单提交调用的action,却使用着不同的协议:post/patch(put)。我们先来简单介绍一下patch和put协议:

  • patch:
    当资源存在时,部分更新资源,例如更新某一个字段;
    当资源不存在时,则创建一个新的资源,像SaveOrUpdate 操作。

  • put:
    当资源存在时,用于更新某个资源较完整的内容,比如说用户要重填完整表单更新所有信息,后台处理更新时可能只是保留内部记录 ID 不变;
    当资源不存在时,PUT 只对已有资源进行更新操作,所以是 update 操作。

那么,我们再回过头来看在rails中,view是如何实现的:

<%= form_for(@user) do |f| %>
    <%= render 'shared/error_messages', object: @user %>

    <%= f.label :name %>
    <%= f.text_field :name, class: 'form-control' %>

    <%= f.label :email %>
    <%= f.email_field :email, class: 'form-control' %>

    <%= f.label :password %>
    <%= f.password_field :password, class: 'form-control' %>

    <%= f.label :password_confirmation %>
    <%= f.password_field :password_confirmation, class: 'form-control' %>

    <%= f.submit yield(:button_text), class: "btn btn-primary" %>
<% end %>

我们发现,在update和create两个表单中,ruby的描述完全相同。再看一下,在update页面中,转化成的html

<form accept-charset="UTF-8" action="/users/1" class="edit_user"
      id="edit_user_1" method="post">
  <input name="_method" type="hidden" value="patch" />
  .
  .
  .
</form>

rails已经自动判断出来是post还是patch。原因何在呢?

The answer is that it is possible to tell whether a user is new or already exists in the database via Active Record’s new_record? boolean method:

$ rails console
> User.new.new_record?
=> true
> User.first.new_record?
=> false

When constructing a form using form_for(@user), Rails uses POST if @user.new_record? is true and PATCH if it is false.

参考:
1. https://www.railstutorial.org/book/updating_and_deleting_users
2. http://unmi.cc/restful-http-patch-method/

以上是关于[Rails]表单提交时,post与patch的内部转化的主要内容,如果未能解决你的问题,请参考以下文章

如何以及在哪里提交 Rails 上的表单值?

Ruby on rails -- Jquery 在另一个 post 请求之前没有提交 put 请求

RoR:发送附加数据以使用 Jquery AJAX 提交

博客应用程序在提交表单时未将属性保存到数据库

Laravel 表单不会 PATCH,只有 POST - 嵌套的 RESTfull 控制器,MethodNotAllowedHttpException

表单未在 Rails 中使用不显眼的 javascript 提交