zoukankan      html  css  js  c++  java
  • [AWDwR4] Getting AJAX to work in Rails 3 with jQuery

    在 Iteration F2 中,按照书上的改法,单击Add Cart之后,页面没有丝毫反应。看后台有错如下:

    Completed 500 Internal Server Error in 12ms
    
    ActionView::MissingTemplate (Missing template line_items/create, application/create with {:locale=>[:en], :formats=>[:js, :html], :handlers=>[:erb, :builder, :coffee]}. Searched in:
      * "/home/csd/railsProjects/depot/app/views"
    ):
      app/controllers/line_items_controller.rb:55:in `create'
    
    
      Rendered /usr/local/rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/missing_template.erb within rescues/layout (0.5ms)

      上网搜索,发现是由于
    在 Rails 3.1及以后的版本中默认使用jQuery作为JavaScript库,而Prototype helpers/RJS 被放到了gem中 ,导致找不到 create.js.erb模板。

      如果想使用JQuery而非 RJS,解决方法如下:

      step1. 把 app/views/line_items/create.js.rjs 文件改名为 app/views/line_items/create.js.erb。
        step2. 用如下的内容替换app/views/line_items/create.js.rjs 的内容:
      

     $('#cart').html("<%= escape_javascript(render(@cart)) %>");
    
    •  $('#cart')用jQuery 语法来选中 id为 cart的元素, 然后将其内容赋值为 render(@cart)。
    • escape_javascript 会将回车,单,双引号进行转义处理。

      修改完成后再次单击 Add to cart 按钮,此时可以看到左边的列表自动更新了,服务器端日志如下:

     

      Rendered line_items/_line_item.html.erb (4.8ms)
      Rendered carts/_cart.html.erb (8.3ms)
      Rendered line_items/create.js.erb (10.4ms)
      Completed 200 OK in 24ms (Views: 12.4ms | ActiveRecord: 3.9ms)

      

      PS:由于在 app/views/store/index.html.erb 中的 button_to 中有参数 :remote => true, 所以 浏览器会发送 Ajax 请求到服务器端(Ajax请求dataType默认是script,即要服务器端返回JavaScript格式的数据)。在app/controllers/line_items_controller.rb 中 create action 中有如下代码:

         respond_to do |format|
          if @line_item.save     
            format.html { redirect_to store_url}
            format.js
            format.json { render json: @line_item, status: :created, location: @line_item }
          else
            format.html { render action: "new" }
            format.json { render json: @line_item.errors, status: :unprocessable_entity }
          end
        end

      respond_to里面的代码执行逻辑如下: 当@line_item保存到数据库成功,如果客户端要求返回的是html格式,则重定向到store页面,如果客户端要求返回的是js格式,则默认渲染(format.js 之后没有 block 来指定操作) 与此action(create)关联的JavaScript模板(create.js.erb)。参考 respond_to

       PS:如果使用的是火狐浏览器,可以使用强大的Firebug插件来调试,在网络->XHR 标签页中可以实时地看到客户端的Ajax 请求和服务器端的响应。

      参考文章:
        Ajax in Rails 3.1 - A Roadmap
        可以学习 Rails 3.2 的 Ajax 向导  http://chloerei.com/2012/04/21/rails-3-2-ajax-guide/

      Rails 3.2 的 Ajax 向导

    回到本系列的目录

  • 相关阅读:
    Codeforces 1439B. Graph Subset Problem (思维,复杂度分析)
    石子游戏(nim游戏+按位考虑)
    Codeforces 1437F Emotional Fishermen(思维,dp)
    Codeforces Round #671 (Div. 2) (A~E)
    Java就业企业面试问题ssh框架
    DUBBO初探搭建DUBBO开发环境
    Spring容器组建注解@Component和Resouces实现完全注解配置
    jUnit 4 在 s2sh 中的应用
    4.5、常量、作用域、内置全局变量
    Java 诗词纵向转换字符流输出
  • 原文地址:https://www.cnblogs.com/Jack47/p/2753977.html
Copyright © 2011-2022 走看看