目标
我有一个网页的项目列表,从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加载
问题是,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的当前版本的这一功能已被弃用的原因是缓慢的。
希望你能理解我的英语不好=)
我发现这个问题! 由于在这两个@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 }
谁也能猜到......
我已经得到这个工作的方式是使用内置该功能的Rails:
- 在你的控制器的编辑操作,添加到
respond_to
块行format.js
。 这允许你创建你可以用它来编辑表单加载到DOM的edit.js.erb文件。 - 然后在同一个控制器的您的更新动作,再次添加
format.js
到respond_to
块,并有一个update.js.erb文件不通过jQuery必要的DOM操作。
我敢肯定,这进一步在在线教程解释,但在那里我终于明白它是如何工作,而不必调用的jQuery AJAX方法是在CodeSchool.com 。
我曾与此类似,其中没有被提出,是通过AJAX加载的形式,这是由于Turbolinks,我找到了解决办法是我的事件结合体,而不是元素,相关的答案中发现的问题这个线程:
如何使用$(文件)。在(“点击..在<标签?
对我来说,问题是上点击一个标签,所以我不得不改变
$('label').click(function...
至
$('body').on('click', 'label', function
我有同样的问题也终于明白了原因。 你的HTML源必须的形成如下。
<tr>
<form>
<td><input type="text"></td>
<td><input type="submit"></td>
</form>
</tr>
这似乎有些浏览器包括Chrome和Firefox不能正确处理这样的嵌套标签。
我可以与其他的像UL /李更换表/ TR / TD标签后成功提交重新呈现形式。