使用javascript提交rails远程表单

Mat*_*hew 22 jquery ruby-on-rails unobtrusive-javascript

在我的rails应用程序中,我有一个看起来像这样的远程表单:

<%= form_tag some_path, :method => :get, :id => 'my-form', :remote => true do %>
  <%= text_field_tag :search, params[:search], :id => 'search-field' %>
  <%= submit_tag 'Go' %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

现在我想通过javascript提交此表单并触发所有rails远程表单回调.到目前为止,我已经尝试了一些东西,但似乎没有任何工作.

我尝试过的事情:

$('#my-form').trigger('onsubmit')

$.rails.callFormSubmitBindings( $('#search-form') )
Run Code Online (Sandbox Code Playgroud)

但到目前为止没有运气.有任何想法吗?

mlt*_*tsy 66

在Rails 5.1+中,用旧jquery-ujs的jquery 替换旧的rails-ujs,上面的答案不再有用,总是通过HTML HTTP请求提交表单.这是您触发新的rails提交事件处理程序的方法:

var elem = document.getElementById('myform') // or $('#myform')[0] with jQuery
Rails.fire(elem, 'submit');
Run Code Online (Sandbox Code Playgroud)

(不能告诉你花了多长时间才弄明白......)出于某种原因,常规事件没有正确地冒泡到使用rails的新委托函数的 rails 附加的委托事件处理程序,当他们由jQuery触发.

  • 非常感谢您的回答!@acrogenesis 我遇到了同样的问题。我发现你可以在 Rails 5.1+ 和 5.2+ 中使用 `jQuery.rails.fire` (或 `$.rails.fire`)。有关向后兼容性的代码,请参阅[此处](https://github.com/rails/rails/blob/5-2-stable/actionview/app/assets/javascripts/rails-ujs/start.coffee#L15)。 (3认同)
  • 我收到此错误 `ReferenceError: Can't find variable: Rails` (2认同)
  • 要解决错误“ReferenceError:找不到变量:Rails”,请确保在“environment.js”中将 Rails 作为插件提供:“environment.plugins.prepend('Provide', new webpack.ProvidePlugin({ Rails: ['@rails/ujs'] }) ) ` (2认同)

Gop*_*ore 65

这只是以Rails方式:

 $("#myform").trigger('submit.rails');
Run Code Online (Sandbox Code Playgroud)

  • 这才是真正的答案.它保留了远程表单的ajax提交行为.谢谢 ! (4认同)
  • 这应该在现代版本的Rails中标记为正确的答案 (2认同)

Gly*_*yph 8

如果您无法Rails通过 JavaScript 进行访问,并且您不想尝试进行设置,那么有一个更简单的解决方案!

您可以requestSubmit在 html 元素上使用,而不是提交,它会按照您期望的方式工作,因为会requestSubmit引发submit偶数,但submit不会。

请在此处查看提交和 requestSubmit 之间的区别: https: //developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit

在上述情况下,您可以使用:

$('#my-form')[0].requestSubmit()
Run Code Online (Sandbox Code Playgroud)


Mla*_*lić 7

如何使用rails_ujs并只需执行以下操作:

Rails.fire(form, 'submit');
Run Code Online (Sandbox Code Playgroud)

(哪里form是DOM元素)

这感觉就像是一种正确的Rails方法。

您可以在此处查看源代码– https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts/rails-ujs/utils/event.coffee#L34


and*_*orp -9

你可以使用.submit();

$("#my-form").submit();
Run Code Online (Sandbox Code Playgroud)

  • 警告:表格不会远程提交(由ajax提交).相反,将发生完全刷新 (17认同)
  • 你能否更新或删除这个误导性的答案?以非远程方式提交远程表单毫无意义.Gopal的答案是正确的. (12认同)
  • 只想添加它必须在jQuery对象上调用.例如,如果您执行类似`$('.a')的操作.change(function {this.submit()})`它不会工作.你必须在`$(this)`这样的jQuery对象中包装`this`.然后你可以调用sumbit. (8认同)