0

我和这个人遇到了同样的问题

我和他一样把 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

创建.js.erb

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

2 回答 2

4

我解决了这个问题。感谢这篇精彩的文章,它告诉我萤火虫能够查看 AJAX 请求的响应来源。JSLint帮助我检查javascript 语法。最后,我要感谢 Firebug,它是一个非常棒的工具。

问题是如果有任何语法错误,则不会执行 javascript。

在我的问题中:

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

所以我只是$('#cart').html("<%= escape_javascript(render(@cart)) %>");改为 $('#cart').html('<%= escape_javascript(render(@cart))%>');

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

于 2012-09-01T01:30:20.813 回答
1

让我们使用 j() 辅助方法: $('#cart').html("<%=j render(@cart) %>");

于 2014-01-04T15:17:35.597 回答