渲染部分并使用jQuery传递集合

时间:2015-04-17 02:35:32

标签: jquery ruby-on-rails ajax haml

我正在尝试使用jQuery渲染部分内容。操作流程单击一个按钮,jquery对我的控制器执行AJAX调用,然后在响应时,它呈现部分传递数组。无论我尝试多少,我都无法实现这一目标。我设置的html(这是ruby)呈现为纯文本而不是ruby。是的,我确实有一个_cart.html.haml文件。

function updateCart( id ) {
    $.ajax({
        url: '/items/add_item',
        data: {'id': id },
        method: 'POST'})
    .done ( function ( data ) {
        var cart = data;
        var cart_items = data["cart_items"];
        var cart_total = data["cart_total"];
        $('#cart-wrapper')
        .html("#{ escape_javascript(render(partial: 'items/cart', collection: " + cart_items + ", as: 'cart_items')) }");
    });
}

提前感谢您的帮助!

编辑: 添加了add_item方法

def add_item
  cart = session[:cart] || Cart.new
  cart.add_item(params[:id])
  respond_to do |format|
    format.json do
      Create an array from the search results.
      results = {
        cart_items: cart.cart_items,
        cart_total: cart.total
      }
      render json: results
    end
  end
  session[:cart] = cart
end

1 个答案:

答案 0 :(得分:2)

使用dataType:script选项,如下所示

function updateCart( id ) {
    $.ajax({
        url: '/items/add_item',
        data: {'id': id },
        method: 'POST',
        dataType: 'script'})
    });

这个发送请求到控制器,从您的控制器执行以下操作

 def add_item
   your logic goes here ....
   @cart_items = ...
   @cart_total = ...
   respond_to do |format|
     format.js {}
   end
 end

然后在相应的视图文件夹中创建add_item.js.erb(我猜它在你的项目视图文件夹中),然后将以下代码放在该文件中

<强> item.js.erb

$('#cart-wrapper').html("<%= j(render(:partial => 'cart', :locals => {:cart_items => @cart_items, :cart_total => @cart_total}))

最后在您的 _cart.html.erb 部分执行所需的每个循环和您的代码,如下所示

<%- cart_items.each do |c| %>
  <%= c.name %>
<% end %>
Total : <%= cart_total %>