使用 JavaScript 提交 Rails 远程表单

submit a rails remote form with javascript

提问人:Matthew 提问时间:12/20/2011 更新时间:2/26/2021 访问量:37170

问:

在我的 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 %>

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

我尝试过的事情:

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

$.rails.callFormSubmitBindings( $('#search-form') )

但到目前为止没有运气。有什么想法吗?

jQuery Ruby-on-Rails 不显眼的javascript

评论

1赞 Michelle Tilley 12/20/2011
怎么样?它是否触发必要的回调?我知道我在自己的代码中使用了类似的代码。$("#my-form").submit()

答:

-9赞 andrewpthorp 12/20/2011 #1

你可以只使用 .submit();

$("#my-form").submit();

评论

8赞 Ismael Abreu 4/17/2013
只想补充一点,它必须在jQuery对象上调用。例如,如果你做这样的事情,它就不会起作用。您必须包装在像 这样的 jQuery 对象中。然后你可以调用sumbit。$('.a').change(function { this.submit() })this$(this)
17赞 Fred 5/20/2016
警告:表单不会远程提交(通过ajax)。相反,将进行完全刷新
12赞 deprecated 6/27/2016
你能更新或删除这个误导性的答案吗?以非远程方式提交远程表单是没有意义的。戈帕尔的答案是正确的。
4赞 prasvin 12/20/2011 #2

如何从控制器传递json并通过js捕获它。

现在,控制器的动作为

respond_to do |format|
      if some condition
        format.json { render :json => {:success => true} }
        format.html{ redirect_to some_path, :notice => "successfully created" }
      else
        ...
      end
end

并在js中捕获json作为

$('#my-form').bind 'ajax:success', (event,data) ->
  if(data.success == true)
    ...

不完全是你要找的,但希望这能有所帮助。

评论

1赞 andrewpthorp 12/20/2011
我相信他只是在问如何提交表格本身。
0赞 Abhaya 12/20/2011
表格不会像上所述远程提交给“some_path”。
80赞 Gopal S Rathore 4/6/2013 #3

这很简单,就是用 Rails 的方式:

 $("#myform").trigger('submit.rails');

评论

4赞 Fred 5/20/2016
这才是真正的答案。它保留了远程表单的 ajax 提交行为。谢谢!
1赞 NobodysNightmare 12/21/2016
请注意 Ismael 的评论:您必须将表单包装在 jQuery 对象中才能进行远程提交行为。所以不是,而是.我也有一段时间没有发现这个问题......myForm.submit()$(myForm).submit()
3赞 Obie 10/31/2017
这应该在现代版本的 Rails 中被标记为正确答案
94赞 mltsy 10/5/2017 #4

在 Rails 5.1+ 中,它用非 jquery 替换了旧的,上面的答案不再起作用,总是通过HTML HTTP请求提交表单。以下是触发新 rails submit 事件处理程序的方式:jquery-ujsrails-ujs

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

(不能告诉你我花了多长时间才弄清楚那个......出于某种原因,当常规事件被 jQuery 触发时,它们不会正确地冒泡到使用 rails 的新委托函数附加的 rails 附加委托事件处理程序。

评论

3赞 acrogenesis 3/22/2018
我收到此错误ReferenceError: Can't find variable: Rails
0赞 Francisco Quintero 2/12/2019
这个答案是旧的,但这对我来说是新的信息。谢谢兄弟。
2赞 GMA 8/27/2019
要解决该错误,请确保在以下位置提供 Rails 作为插件:ReferenceError: Can't find variable: Railsenvironment.jsenvironment.plugins.prepend('Provide', new webpack.ProvidePlugin({ Rails: ['@rails/ujs'] }) )
3赞 Alexander 11/29/2019
非常感谢您的回答!@acrogenesis我遇到了同样的问题。我发现你可以在 Rails 5.1+ 和 5.2+ 中使用(或)。有关向后兼容性的代码,请参阅此处jQuery.rails.fire$.rails.fire
1赞 James Hong 3/23/2018 #5

@mltsy答案对我来说是完美的。但是,我想重申一下,这需要使用 rails-ujs。如果您像我一样从旧版本升级,您可能仍在使用 jquery 依赖jquery_ujs。如果你要进入你的控制台,请检查你的应用程序.js并确保你有rails-ujs,否则@mltsy的好答案将不起作用。我想发表评论而不是回答,但 Stack 不让我。ReferenceError: Can't find variable: Rails

16赞 Mladen Ilić 4/24/2018 #6

如何使用并简单地执行以下操作:rails_ujs

Rails.fire(form, 'submit');

(其中是 DOM 元素)form

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

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

4赞 mentatkgs 12/16/2019 #7

我正在更新rails 6的答案。

如果您在 rails 6 中遇到此问题,可能是您忘记将参数 “format: :js” 添加到表单构建器中。

<%= form_tag some_path, :method => :get, :id => 'my-form', :remote => true,
         :format => :js do %>
  <%= text_field_tag :search, params[:search], :id => 'search-field' %>
  <%= submit_tag 'Go' %>
<% end %>

您还需要在控制器中包含格式.js。

def update
    respond_to do |format|
      if @model.update(user_params)
        format.html { redirect_to @model, notice: 'Model was successfully updated.' }
        format.json { render :show, status: :ok, location: @model }
        format.js {
          logger.debug "this will run in the update was ok."
        }
      else
        format.html { render :edit }
        format.json { render json: @model.errors, status: :unprocessable_entity }
        format.js {
          logger.debug "this will run in the update was not ok."
        }
      end
    end
  end

现在,在 JavaScript 中,您可以定期调用提交到此表单。

this.form.submit()
2赞 Jonas 3/13/2020 #8

我知道这是一个古老的话题,但我现在已经为此苦苦挣扎了一段时间,终于找到了解决方案。

我有一个包含一个表单的表单,我希望该表单在用户添加文件后立即自动提交。我试过了,但这样表格就以 HTML 形式提交。remote: truefile_fieldonchange: form.submit();

我的解决方案:使用JS单击(隐藏的)表单提交按钮:

onchange: $("#submit-button").click();
7赞 GlyphGryph 2/26/2021 #9

如果您无法从 javascript 访问,并且不想尝试设置它,那么有一个更简单的解决方案!Rails

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

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

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

$('#my-form')[0].requestSubmit()

评论

0赞 Joshua Pinter 5/5/2022
这是一种美。甚至不知道这是一回事,可以用来远程提交表格。谢谢!requestSubmit
0赞 Joshua Pinter 5/6/2022
需要注意的是:Internet Explorer 或 Safari 根本不支持此功能。caniuse.com/mdn-api_htmlformelement_requestsubmit