我想使用带有post请求的ajax发送整个表单输入。 我使用的是js代码:
$.post('#{my_custom_action_path}', $('#myform').serialize(), function(data) {
console.log("Success !")
});
问题是表单是由rails和#34; _method"生成的。输入包含"补丁" 使用错误路由的结果(使用补丁路由,而不是我在路线中定义的帖子)
如何在通过ajax发送表单之前更改_method字段?
答案 0 :(得分:2)
您也可以在发送之前通过javascript更改输入值:
$("input[name='_method']").val('post');
或者您可以在序列化表单时跳过此字段:
$('#myform').find("input[name!='_method']").serialize()
答案 1 :(得分:1)
解决方案是在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">
,当序列化时通过AJAX发送的Jquery将使Rails查找patch
路由而不是post
路由,无论您在type
或method
内设置$.axax({})
设置。
当您在模板中定义method: post
时,Rails会将<form>
与method="post"
保持一致,但它会避免生成隐藏字段标记,从而欺骗控制器。
答案 2 :(得分:0)
您正在使用jQuery ajax $.post
简写方法,该方法简称:
$.ajax({
type: "POST",
url: url,
data: data,
success: success,
dataType: dataType
});
如果您使用此较长的表单,则可以使用POST
轻松替换PATCH
。
答案 3 :(得分:0)
使用$('form').find("[name!='_method']").serialize()
这
将查找表单中所有未命名为_method
的元素。
这不要与$('#myform').find("input[name!='_method']").serialize()
混淆(如之前建议的答案)。
此行将查找所有未命名为_method
的 input(并且仅输入)元素。如果您的表单中还有其他元素,例如 select 或 textarea ,则此行实际上也会将其剥离。