Rails 3.1 ajax:成功处理

Posted

技术标签:

【中文标题】Rails 3.1 ajax:成功处理【英文标题】:Rails 3.1 ajax:success handling 【发布时间】:2011-09-28 21:46:59 【问题描述】:

所以我在使用 CoffeeScript、Rails 3.1 和所有好东西。我有一个包含所有常用路线索引、显示、创建、编辑、更新、销毁的资源。

索引视图有一个使用:remote => true 的表单,如下所示:

<%= form_for @todo, :remote => true do |f| %>
    <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %> 

在用于创建的控制器中,我有以下内容:

def create
    @todo = Todo.new(params[:todo])

    respond_to do |format|
      if @todo.save
        format.html  redirect_to @todo, notice: 'Todo was successfully created.' 
        format.json  render json: @todo, status: :created, location: @todo 
        format.js render json: @todo 
      else
        format.html  render action: "new" 
        format.json  render json: @todo.errors, status: :unprocessable_entity 
      end
    end
  end

我试图不使用 .js.erb 视图,因为我宁愿处理返回的 JSON 并将所有花哨的附加到待办事项列表等等。 (我觉得它更干净)。

在我的 todos.js.coffee 中,我使用了以下内容:

$(document).ready ->
    $("#new_todo")
      .bind "ajax:success", (event, data) ->
        alert("Ajax SUCCESS!!!")

(是的,只是打开警告框不起作用)我尝试加载但无法触发此事件。请求确实成功完成并添加了新的待办事项。

对此的任何帮助将不胜感激。谢谢

【问题讨论】:

您可以查看 Firebug 以了解 XHR 对话是什么。这可能会对您的应用返回的内容有所了解。 是的,抱歉应该说我得到了我所期望的,新创建的待办事项的 JSON 【参考方案1】:
    什么是#new_todo?是否存在具有该 ID 的元素?验证代码中的 $('#new_todo').length &gt; 0 是否是绑定事件处理程序的正确元素。 什么是ajax:success? jQuery API 定义了一个ajaxSuccess 事件(参见Ajax Events docs),但我之前从未见过带有冒号的版本。

【讨论】:

#new_todo 是创建 todo 项的表单的 id,我确信它存在。至于 ajax:success,这是默认为所有 Rails3+ 应用程序添加的 rails.js aka jquery_ujs 嗯,如果您将警报回调绑定到表单的'submit' 事件会发生什么? 嗯,有点可疑,没有任何反应。 v.strange 生病看咖啡脚本 更奇怪的是,我从等式中删除了coffeescript(暂时)并将绑定添加到application.js文件中的js中提交,但仍然没有。 $('#new_todo').submit(function() alert("hello"); ); 对,您的 CoffeeScripting 没有问题。我再次询问您是否确定表单的 ID 是#new_todoconsole.log $('#new_todo').length 是什么?如果绑定submit回调然后调用.submit()触发会发生什么?【参考方案2】:

开始倒在 rails.js 上,想知道是否有任何 ajax: 回调被引发。

原来他们在 beforeSend 和错误...等一下...错误?这怎么可能?新待办事项的创建成功发生,响应是我期望的 JSON。但是在单步执行回调代码时,我注意到 Invalid label 错误。

稍后快速谷歌将我带到这篇文章http://blog.seqmedia.com/?p=484

原来 JSON 是作为字符串返回的,Firbug 得到了它并正确解析了它,所以我可以检查响应。但是rails.js和js一般不知道如何处理字符串并抛出上述错误(我可能会默默地说)。

解决方案在respond_to中

format.js render json: @todo, content_type: 'text/json' 

感谢 Trevor Burnham(就像 BTW 书一样)的帮助以及来自 sequence media 的 Amy,他的博文最终为我提供了解决方案。

【讨论】:

天哪,你救了我。我遇到了完全相同的问题并且完全被卡住了。为什么rails默认不将json渲染为json?? 谢谢,这也帮助了我。

以上是关于Rails 3.1 ajax:成功处理的主要内容,如果未能解决你的问题,请参考以下文章

rails3 rails.js 和 jquery 捕获 ajax 请求的成功和失败

jQuery绑定ajax:成功在rails 3应用程序中无法用于新创建的(ajax)项目

Rails ajax 表单发送电子邮件但不在“成功”下运行代码

jquery 不会在 $.ajax 上为 rails 标准 REST DELETE 答案调用成功方法

如何绑定到表单的 ajax:使用 JQuery/Rails UJS 在 typescript 中取得成功

内联 Javascript 在 Rails 3.1 上重新渲染部分 ruby​​ 时无法正常工作