无法绑定ajax:使用form_for ....创建的表单成功:remote =>真正

时间:2012-03-16 15:23:11

标签: 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控制台(网络标签)中正确显示。但我似乎无法抓住回应。

我想在提交后更新页面上的备注列表。我一直试图绑定到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);

})

你能否指出我可能出现的问题?

3 个答案:

答案 0 :(得分:9)

你试过'ajax:complete'吗?

其他可能出错的地方:

状态代码并非真正“成功”。这会在jQuery中取得成功

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

或者在呈现表单之前评估了事件处理程序。尝试事件委托:

$("body").on('ajax:success', '#new_note', function(){...})

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

答案 1 :(得分:1)

如果你愿意,你可以将你的javascript放在create.js.erb中(此文件中的代码将在响应后进入你的浏览器) 在这个文件中你可以使用if语句,比如

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

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

答案 2 :(得分:0)

这通常是通过在控制器的视图部分中执行create.js.erb文件来完成的(如果还没有这样做的话),在该文件中您可以访问创建操作中出现的任何变量,并且您可以在其中进行渲染你的HTML

在您的create.js.erb文件中,您可以编写类似

的内容
$("#new_note").html('<%= escape_javascript(render partial: "path/to/partial") %>');

this post中阅读更多我前段时间写过的内容,它几乎解释了整个流程