如何使用 ajax post 请求和 rails 发送表单

How to send form with ajax post request with rails

我想使用 ajax 和 post 请求发送整个表单输入。 我正在使用这段 js 代码:

$.post('#{my_custom_action_path}', $('#myform').serialize(), function(data) {
    console.log("Success !")
});

问题是表单是由 rails 使用包含 "patch" 的“_method”输入生成的 这是使用错误路由的结果(它使用了补丁路由,而不是我在路由中定义的post)

如何在通过 ajax 发送表单之前更改 _method 字段?

您正在使用 jQuery ajax $.post shorthand 方法,它是以下简称:

$.ajax({
  type: "POST",
  url: url,
  data: data,
  success: success,
  dataType: dataType
});

如果您使用这种较长的形式,很容易将 POST 替换为 PATCH

您也可以在发送前通过javascript更改输入值:

$("input[name='_method']").val('post');

或者您可以在序列化表单时跳过此字段:

$('#myform').find("input[name!='_method']").serialize()

解决方案是在 Rails 表单生成器上指定 method: post,如下所示:

<%= simple_form_for @model, html: {method: :post} do |form| %>

或者只是 method: post 如果您使用的是 form_for @model

这是如何工作的:

如果你查看 HTML Rails 生成,你会看到 <form> 标签已经有 method="post",但正如你所说 Rails生成一个隐藏字段 <input type="hidden" name="_method" value="patch">,当由 Jquery 序列化并通过 AJAX 发送时,将使 Rails 查找 patch 路由而不是 [=18] =] 路线,无论您在 $.axax({}) 设置中的 typemethod 中设置了什么。

当您在模板中定义 method: post 时,Rails 会将 <form> 保留为 method="post",但它会避免生成欺骗控制器的隐藏字段标签.

使用$('form').find("[name!='_method']").serialize()

这个 将找到未命名为 _method.

的所有表单元素

这不要与 $('#myform').find("input[name!='_method']").serialize() 混淆(如之前建议的答案)。 此行将找到所有未命名为 _methodinput(并且仅 input) 元素。如果您的表单中有其他元素,例如 selecttextarea 这一行实际上也会将它们剥离。