Javascript 无法将ajax:success绑定到使用表单_为…创建的表单:远程=>;真的

Javascript 无法将ajax:success绑定到使用表单_为…创建的表单:远程=>;真的,javascript,ruby-on-rails,ajax,form-for,Javascript,Ruby On Rails,Ajax,Form For,我使用的是Rails 3.1.1 在haml看来,我有以下几点: = form_for booking.notes.build, :remote => true do |f| = f.text_area(:content) = f.hidden_field(:noteable_id) = f.hidden_field(:noteable_type) = f.submit('Add note') 这将在提交时创建新注释。此外,来自我的控制器的响应正确显示在Chrome控制台

我使用的是Rails 3.1.1

在haml看来,我有以下几点:

= form_for booking.notes.build, :remote => true do |f|
  = f.text_area(:content)
  = f.hidden_field(:noteable_id)
  = f.hidden_field(:noteable_type)
  = f.submit('Add note')
这将在提交时创建新注释。此外,来自我的控制器的响应正确显示在Chrome控制台(网络选项卡)中。但我似乎无法抓住答案

我想在提交后更新页面上的注释列表。我一直在尝试绑定到ajax响应,以便获取响应,但我失败了。例如,我认为这应该有效,但不能:

$('#new_note').bind('ajax:success', function() {
  alert('Hi');
});
但不会触发警报。我想这也解释了为什么这也不起作用

 $('#new_note').bind("ajax:success", function(evt, data, status, xhr){
  // Insert response partial into page below the form.
  $(this).parent.append(xhr.responseText);

})

你能告诉我可能出了什么问题吗?

这通常是通过在控制器的视图部分(如果还没有)中创建一个
create.js.erb
文件来完成的,在该文件中,你可以访问create操作产生的任何变量,并在那里呈现html

create.js.erb
文件中,您可以编写如下内容

$("#new_note").html('<%= escape_javascript(render partial: "path/to/partial") %>');
$(“#新注释”).html(“”);

在我不久前写的文章中阅读更多内容,它几乎解释了整个流程

您是否尝试过“ajax:complete”

其他可能出现问题的地方:

状态代码不是真正的“成功”。这将触发jQuery中的成功

if ( status >= 200 && status < 300 || status === 304 ) {

(小心,这是新的jQuery语法。如果使用旧的jQuery,请进行相应调整)

如果需要,可以将javascript放入create.js.erb中(此文件中的代码将在响应到达浏览器后执行) 在这个文件中,可以使用if语句,比如

<% if @ok %>
  //your code
<% end %>

//你的代码

如果在控制器的操作中将@ok设置为false,则响应将为空

这是有争议的,这是“普遍做”。我个人认为这是一个糟糕的做法,使你的代码变得不可维护。JS应该转到它所属的资产文件夹。这与资产无关,而是Rail中默认处理javascript处理程序的方式。我想说的是,仅仅因为您可以从控制器返回javascript,并不意味着这是最好的解决方案。我想是口味的问题,我不喜欢这种方法。我通过使用create.js.erb和更新必要对象的代码来解决这个问题。但我希望能够获取ajax调用,以便在必要时使用ajax错误对象。从jQuery 1.8开始,.ajaxSuccess()方法应该只附加到文档。这不是ajaxSuccess()。Rails仍然在data remote='true'的元素上触发'ajax:success'事件。这就是“UJS”的东西,对吗?很抱歉你的答案很好。
<% if @ok %>
  //your code
<% end %>