3

如何将添加到购物车按钮添加到目录中的每个产品?我创建了链接

  <%= link_to fast_cart_path do %>
     Add To Cart
  <% end %>

以及操作,OrdersController#update 的副本

  def fast_cart
    populator = Spree::OrderPopulator.new(current_order(true), current_currency)
    if populator.populate(params.slice(:products, :variants, :quantity))
      current_order.create_proposed_shipments if current_order.shipments.any?

      fire_event('spree.cart.add')
      fire_event('spree.order.contents_changed')
      respond_with(@order) do |format|
        format.html { redirect_to cart_path }
      end
    else
      flash[:error] = populator.errors.full_messages.join(" ")
      redirect_to :back
    end
  end

我没有任何错误,但由于某种原因产品未添加到购物车。

4

2 回答 2

2

如果您查看 Spree::OrderPopulator 中的代码: https ://github.com/spree/spree/blob/v2.0.4/core/app/models/spree/order_populator.rb#L20

您会看到它从传入的散列中获取变量,并尝试添加从散列中的产品或变体传入的任何内容。

您上面的代码包含

params.slice(:products, :variants, :quantity)

这是正确的,但是,您指定的链接不会将任何产品或变体添加到参数中。因此,它尝试不添加任何内容,成功添加任何内容,然后继续。

您应该查看 Spree 中更新订单的代码:

https://github.com/spree/spree/blob/v2.0.4/frontend/app/views/spree/orders/edit.html.erb#L14

或将新产品添加到购物车的此代码:

https://github.com/spree/spree/blob/v2.0.4/frontend/app/views/spree/products/_cart_form.html.erb

如果您撬开它们并查看那里发生了什么,您应该对如何将产品添加到购物车有更好的了解。


另一种选择是查看 Spree API 并使用此调用将 Line Item 添加到您的订单中:

http://api.spreecommerce.com/v1/order/line_items/#creating-a-line-item

于 2013-08-16T16:15:35.880 回答
2

感谢@gmacdougall 的指点。只是想添加我如何解决它:

1)复制部分(在文件夹_cart_form.html.erb中找到它并将其重命名为。这个新文件仍应与.frontend/app/views/spree/products_quick_cart_form.html.erb_cart_form.html.erb

2) 在第 35 行附近的部分中包含这个部分_products.html.erb(在frontend/app/views/spree/shared- 这个部分循环遍历产品并显示它们)。包含代码应该看起来像 <%= render :partial => 'spree/products/quick_cart_form', locals: { product: product } %>

3) 注意局部变量product是传递给局部变量的。这很重要,因此添加到购物车方法与产品对象一起提供。

@product4) 将新部分中的所有实例重命名_quick_cart_form.html.erb为 just product(匹配提供的局部变量),并隐藏/自定义此新部分中所需的任何 div。

这应该允许您直接从产品索引页面(例如类别页面)将产品添加到购物车。

`

于 2016-02-17T10:50:05.350 回答