扶手:不能提交自己通过Ajax加载远程表格(Rails: cannot submit a remot

2019-09-04 02:55发布

目标

我有一个网页的项目列表,从Rails的后端到来。 我希望能够在该列表编辑一行,通过使用Rails的UJS Ajax调用。

途径

我添加了一个编辑按钮,每一行的末尾。 编辑按钮是一个link_to ... :remote => true 。 点击它再次加载列表中,但在编辑模式下选择行。 可编辑的行是嵌入在一个form ... :remote => true 。 该行中的保存按钮是一个submit按钮。

index.html.haml

#editor
  %table
    - @items.each do |item|
      %tr
        = render :partial => 'row', :locals => { :item => item }

_row.html.haml

... 
%td // a number of columns with attributes
...
%td
  = link_to t("actions.edit"), edit_item_path(item), :remote => true
  = link_to t("actions.delete"), item_path(item), :remote => true, :method => :delete, :data => { :confirm => "Are you sure?" }

edit.html.haml

#editor
  %table
    - @items.each do |item|
      %tr
        - if item == @item
          = form_for @item, :url => item_path(@item), :remote => true, do |f|
            = render :partial => "row_form", :locals => { :f => f }
        - else
          = render :partial => 'row', :locals => { :item => item }

_row_form.html.haml

... 
%td // a number of columns with editable attributes
...
%td
  %button{ :type => "submit" }=t("actions.save")
  = link_to t("actions.cancel"), items_path, :remote => true

Ajax响应处理

$("#editor").on("ajax:success", function(event, data, status, xhr) {
  $("#editor").html($(data).find("#editor").html());
});

问题

当我在编辑模式下加载列表页/items/12/edit ,第12项的行编辑。 点击Save按钮提交正确通过Ajax的形式和加载/items指数部分,更换使用jQuery的编辑列表。 再次点击编辑按钮,再次加载编辑页面(如/items/12/edit ),与嵌入式形式。 只是这一次,形式没有得到提交点击保存按钮的时候了。 看来提交事件处理程序没有连接到动态加载远程形式。

如何提交通过Ajax加载,preferrably使用了Rails UJS方式远程形式?

重复

我知道有这个问题的重复,但没有人进行了解答。 我希望有人终于有一个明确的答案出现。

  • Rails的文件准备好后,通过Ajax加载远程形式不提交
  • :远程=>真/数据远程表单上通过AJAX加载

Answer 1:

问题是,DOM是由javascript和回调(在您的例子阿贾克斯成功)修改只是对DOM的init初始化。 所以,当DOM改变(#editor的一部分)回调没有工作。

所以你建议立即进行删除重新初始化这个回调更改DOM使用JavaScript的任何时间

$("#editor").on("ajax:success", function(event, data, status, xhr) {
  $("#editor").html($(data).find("#editor").html());
});

前段时间的jQuery已经被称为“活”的功能。 它的工作就像“上”,但跟踪的DOM changings。 但在jQuery的当前版本的这一功能已被弃用的原因是缓慢的。

希望你能理解我的英语不好=)



Answer 2:

我发现这个问题! 由于在这两个@Jake史密斯和@Parandroid的答案的提示。 下面是我在两个步骤中。

发现1

尽管取得了ajax:success被解雇似乎没有成为问题,它没有像形式的处理不只是在正常工作100% $("#editor")选择。 在需要加以最起码$("#editor form")但如果我们从索引页,其中不包含尚未形式启动可能无法正常工作。 因此,通过@Jake史密斯提出的办法似乎是毕竟走的最可靠的方法。 这导致:

edit.html.haml

#editor
  = render :partial => "edit"

edit.js.erb

$('#editor').html('<%= escape_javascript render("edit") %>');

_edit.html.haml(仍然没有工作)

%table
  - @items.each do |item|
    %tr
      - if item == @item
        = form_for @item, :url => item_path(@item), :remote => true, do |f|
          = render :partial => "row_form", :locals => { :f => f }
      - else
        = render :partial => 'row', :locals => { :item => item }

但是,这仍然没有导致工作提交按钮。 直到我发现了什么问题?

发现2

上面的解决方案确实给提交按钮普通的旧POST行为,该服务器不喜欢,因为它预期PUT达到update的动作。 导轨通过生成一个隐藏的执行此_method具有值字段PUT 。 我发现轨道上的最顶端产生这个字段(和其他几个重要的隐藏字段) _edit.html.haml部分,而不是里面form标记! 让我感动的形式向部分的顶部,它的工作!

_edit.html.haml(WORKING!)

= form_for @item, :url => item_path(@item), :remote => true, do |f|
  %table
    - @items.each do |item|
      %tr
        - if item == @item
          = render :partial => "row_form", :locals => { :f => f }
        - else
          = render :partial => 'row', :locals => { :item => item }

谁也能猜到......



Answer 3:

我已经得到这个工作的方式是使用内置该功能的Rails:

  1. 在你的控制器的编辑操作,添加到respond_to块行format.js 。 这允许你创建你可以用它来编辑表单加载到DOM的edit.js.erb文件。
  2. 然后在同一个控制器的您的更新动作,再次添加format.jsrespond_to块,并有一个update.js.erb文件不通过jQuery必要的DOM操作。

我敢肯定,这进一步在在线教程解释,但在那里我终于明白它是如何工作,而不必调用的jQuery AJAX方法是在CodeSchool.com 。



Answer 4:

我曾与此类似,其中没有被提出,是通过AJAX加载的形式,这是由于Turbolinks,我找到了解决办法是我的事件结合体,而不是元素,相关的答案中发现的问题这个线程:

如何使用$(文件)。在(“点击..在<标签?

对我来说,问题是上点击一个标签,所以我不得不改变

$('label').click(function...

$('body').on('click', 'label', function



Answer 5:

我有同样的问题也终于明白了原因。 你的HTML源必须的形成如下。

<tr>
  <form>
    <td><input type="text"></td>
    <td><input type="submit"></td>
  </form>
</tr>

这似乎有些浏览器包括Chrome和Firefox不能正确处理这样的嵌套标签。

我可以与其他的像UL /李更换表/ TR / TD标签后成功提交重新呈现形式。



文章来源: Rails: cannot submit a remote form that was loaded via Ajax