【问题标题】:The AJAX request cannot see the effect without refresh the browser in Rails在Rails中不刷新浏览器AJAX请求看不到效果
【发布时间】:2012-08-26 14:16:09
【问题描述】:

我和这个人面对same problem

我和他一样把 rjs 改成 js.erb。我们都使用<%= button_to 'Add to Cart',line_items_path(:product_id => product) ,:remote=>true %> 向控制器发送AJAX 请求。 format.js 罚款并执行 create.js.erb。但是购物车没有添加任何东西。

日志结果:

Rendered line_items/_line_item.html.erb (4.3ms) Rendered carts/_cart.html.erb (8.0ms) Rendered line_items/create.js.erb (8.8ms)

这就是我们发送AJAX请求的index.html.erb

<% if notice %>
<p id="notice"><%= notice %></p>
<% end %>
<h1>Your Pragmatic Catalog</h1>

<% @products.each do |product| %>
<div class="entry">
<%= link_to image_tag(product.image_url), line_items_path(:product_id => product), html_options = {:method => :post} %>
    <h3><%= product.title %></h3>
    <%=sanitize product.description %>
    <div class="price_line">
      <span class="price"><%= number_to_currency(product.price,:precision=>3) %></span>
      <%= button_to 'Add to Cart',line_items_path(:product_id => product) ,:remote=>true %>
    </div>
  </div>
<% end %>

这就是处理请求的 line_items 控制器函数

  # POST /line_items
  # POST /line_items.json
  def create
     # for exercise only
    session[:counter] = nil

    @cart = current_cart
    product = Product.find(params[:product_id])
    @line_item = @cart.add_product(product.id)



    respond_to do |format|
      if @line_item.save
        format.html { redirect_to store_index_path }
        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


  end

create.js.erb

$('#cart').html("<%= escape_javascript(render(@cart)) %>");

【问题讨论】:

  • 您需要添加更多信息。我们没有足够的信息来帮助您。
  • 您的视图文件夹中有create.js.erb 文件吗?当您请求 .js (AJAX) 响应时,Rails 需要知道返回给您的内容。
  • 我在里面有一个create.js.erb。问题似乎是没有从index.html.erb 发送到控制器的 AJAX 请求,所以format 始终是format.html
  • 我知道现在发生了什么 :) 这本书教我将 javascript 标签更改为 :default 但不是 'application'
  • 但它现在导致我出现双重渲染问题:(

标签: javascript html ruby-on-rails ruby


【解决方案1】:

让我们使用 j() 辅助方法:$('#cart').html("");

【讨论】:

    【解决方案2】:

    我解决了这个问题。 感谢great article,它告诉我萤火虫能够看到来自 AJAX 请求的响应源。 JSLint 帮助我检查 javascript 语法。 最后,我要感谢 Firebug,它是如此出色的工具。

    问题是如果有任何语法错误,javascript没有被执行。

    在我的问题中:

    我应该使用单引号而不是双引号来包装渲染结果。渲染结果带有许多带有“”的 HTML,而将它们包装起来的“”会导致 javascript 中的语法错误。 (双引号中的双引号是不允许的)

    所以我只需将$('#cart').html("&lt;%= escape_javascript(render(@cart)) %&gt;"); 更改为 $('#cart').html('&lt;%= escape_javascript(render(@cart))%&gt;');

    我希望这个答案能帮助其他同样遭受这个噩梦的员工。 如果可能的话,帮助我提高问题率:)

    【讨论】:

      猜你喜欢
      • 2013-07-28
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      相关资源
      最近更新 更多