我和这个人面对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)) %>");
答案 0 :(得分:4)
我解决了这个问题。 感谢great article告诉我firebug从AJAX请求中看到响应源的能力。 JSLint帮我查看javascript语法。 最后,我要感谢Firebug,这是一个非常棒的工具。
问题是如果语法错误,则不会执行javascript。
在我的问题中:
我应该使用单引号而不是double-qouted来包装渲染结果。渲染结果带有许多带有“”的HTML,而“”包装它们将导致javascript中的语法错误。 (不允许双重双击)
所以我只需将$('#cart').html("<%= escape_javascript(render(@cart)) %>");
更改为
$('#cart').html('<%= escape_javascript(render(@cart))%>');
我希望这个答案能够帮助那些也受这个噩梦员工影响的人。 如果可能,请帮我提高问题率:)
答案 1 :(得分:1)
让我们使用j()辅助方法:$('#cart')。html(“&lt;%= j render(@cart)%&gt;”);