【问题标题】:Rails - How do I get my remote form to respond with JS?Rails - 如何让我的远程表单用 JS 响应?
【发布时间】:2013-01-03 19:18:11
【问题描述】:

我有一个列出项目的页面。在每个项目下方,它列出了该项目的所有 cmets (cmets 是 items 下的嵌套资源)。

您可以在项目页面上添加新的内嵌评论。当你这样做时,它正在重新加载整个页面,所以我想将其更改为使用 Ajax 并仅使用 jQuery 插入评论。

所以我将我的 cmets/_form.html.erb 更改为使用 :remote=>true

<%= form_for([@item,@comment], :remote=>true) do |f| %>

我在我的 cmets_controller 中添加了一个 format.js:

def create
  @comment = Comment.new(params[:comment])
  @comment.save

  respond_to do |format|
    format.js
    format.html { redirect_to items_path}
  end
end

并创建了一个简单的 cmets/create.js.erb 来将新评论插入页面:

$("#comments").append("<%= j(render(@comment)) %>");

但是,当我提交评论时(即使在表单上使用 :remote=>true),它也会不断重新加载整个页面/忽略我的 .js 文件。

所以我从 respond_to 中删除了 format.html(因为我不想使用该选项),但是它给了我错误 Completed 406 Not Acceptable in 4ms (ActiveRecord: 0.2ms)

我怎样才能让它留在当前页面上并用我的 create.js 响应?

【问题讨论】:

  • 您是否在页面上正确包含jqueryjquery_ujs 脚本?
  • &lt;%= form_for([@item,@comment], :remote=&gt; true) do |f| %&gt;(TRUE 不应作为符号传递)
  • dogbert - 我相信是这样,因为我有 ajax w/jquery 在这个应用程序的其他地方工作得很好。
  • Yoshiji 先生 - 哎呀,谢谢!我的代码是正确的,我的帖子是错误的 - 我刚刚修复了它。

标签: ruby-on-rails ruby-on-rails-3 jquery ruby-on-rails-3.2


【解决方案1】:

我刚刚发现了问题:

我正在使用 javascript:this.form.submit() 提交我的 cmets 表单。当我不使用:remote=&gt;true 时,效果很好。但是由于某种原因,当我填写:remote=&gt;true 时会中断。

如果我使用实际的提交按钮,我的问题中的代码可以正常工作。

或者,如果我将我的 JavaScript 从 this.form.submit() 更改为使用 jQuery 通过 id 选择表单并提交,那也可以:

$("#new_comment_<%= @item.id %>").submit();

【讨论】:

    【解决方案2】:

    我在 2020 年尝试使用 Rails 6 解决类似问题时遇到了这个问题。

    我有一个使用form_with 创建的表单,默认情况下是remote: true,我使用HTMLFormElement 上的submit() 函数在Stimulus.js 控制器中提交它。这不起作用,但使用 &lt;input type="submit"&gt; 按钮代替了工作,就像在原始问题中一样。

    这背后的原因是在 JavaScript 中调用 submit() 不会触发表单上的 onsubmit 事件,而单击 &lt;input type="submit"&gt; 按钮会触发此事件 (MDN docs)。 Rails 对remote: true 的处理取决于触发此事件,因此行为中断。

    我使用this answer 中的解决方法在 JavaScript 中提交我的表单,remote: true 行为现在按预期工作。

    另外,如果您使用rails-ujs,您可以使用此包装器提交表单 (source):

    form = document.querySelector('form');
    Rails.fire(form, 'submit');
    

    我希望这对其他人有帮助!

    【讨论】:

    • 感谢您的回答@gueorgui!我在 Rails 6.x 上遇到了类似的问题,在提交表单时,*.js 文件没有在 respond_to 块中调用。这里有趣的是,它使用的是以前按预期工作的表单!在过去两天拔掉我的头发后,只需将rails-ujs 重新包含在application.js 中就可以了。很奇怪!
    【解决方案3】:

    您应该将:format =&gt; :js 添加到您的form_for

    并且可能会更新,

    format.js { render :nothing => true } 
    

    【讨论】:

    • bullfrog:我到底应该在哪里添加它?我试过这样做: true, :url=>item_cmets_path(:format=>:js)) do |f| %> 但这并没有做正确的事情——它让我离开了我想要停留的页面,并加载了一个显示我的 create.js 内容的页面,就好像它是一个文本文件一样
    • 试试&lt;%= form_for([@item,@comment], :format =&gt; :js, :remote=&gt;true) do |f| %&gt;
    • 同样的事情:它让我离开我想要停留的页面并加载一个显示我的 create.js 内容的页面,就好像它是一个文本文件一样。知道为什么会这样做吗?
    • 你加入了jquery_ujs 吗?
    • 谢谢牛蛙!我遇到了同样的问题并通过包含jquery_ujs 解决了它
    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多