如何使用rails

时间:2015-05-26 12:49:45

标签: jquery ruby-on-rails ajax activeadmin

我想使用带有post请求的ajax发送整个表单输入。 我使用的是js代码:

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

问题是表单是由rails和#34; _method"生成的。输入包含"补丁" 使用错误路由的结果(使用补丁路由,而不是我在路线中定义的帖子)

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

4 个答案:

答案 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路由,无论您在typemethod内设置$.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 ,则此行实际上也会将其剥离。