我正在尝试使用rails构建一个简单的购物车,现在我可以将产品添加到购物车,我想知道如何在购物车中编辑产品,我正在使用会话来控制购物中的产品大车。这是用户在添加到购物车时看到的内容:
<% @cart.items.each do |item| %>
<tr>
<td>
<%= image_tag item.pic , :alt => "#{item.title}" %>
</td>
<td>
<%= link_to "#{item.title}" , store_path(item.product_id) %>
</td>
<td>
<%= item.unit_price %>
</td>
<td>
<%= item.quantity %>
</td>
<td>
<%= item.total_price %>
</td>
<% end %>
</tr>
这是CartItem类:
class CartItem
attr_reader :product, :quantity
def initialize(product)
@product = product
@quantity = 1
end
def increment_quantity
@quantity += 1
end
def product_id
@product.id
end
def title
@product.name
end
def pic
@pic = @product.photo.url(:thumb)
end
def unit_price
@product.price
end
def total_price
@product.price * @quantity
end
end
我想让用户能够编辑产品数量或删除产品,而不仅仅是清除整个购物车。我怎么能这样做?
答案 0 :(得分:0)
嗯,你已经有了一些紧密的设置。您的购物车项目模型中有increment_quantity方法,因此您需要设置购物车模型以允许您指定产品,然后调用新方法,如下所示:
cart.rb(假设这是您的购物车型号)
def increment_product_quantity(id, quantity)
product_to_increment = @items.select{|product| product.product_id == id}
# We do this because select will return an array
unless product_to_increment.empty?
product_to_increment = product_to_increment.first
else
# your error handling here
end
product_to_increment.quantity = quantity
end
def remove_product(id)
@items.delete_if {|product| product.product_id == id }
end
现在,您必须将购物车项目模型修改为数量不是attr_reader对象,而是attr_accessor对象,或者专门为您设置数量的地方创建购物车项目的方法;你的选择。
还有其他一些事情可以做,但这是我现在可以推荐的最简单,最干净的方法。
答案 1 :(得分:0)
好问题。我能够使删除功能起作用。看起来您正在关注务实的程序员Agile Web Development with Rails,第三版。
我们走了......
添加到add_to_cart.html.erb
我在最后一个tr行项旁边添加了下表行:
<td><%= link_to 'remove', {:controller => 'inventories', :action => 'remove_cart_item', :id => "#{item.getinventoryid}"} %></td>
至CartItem.rb模型
更改了attr_reader:inventory,:数量为attr_accessor :inventory, :quantity
def getinventoryid
@inventory.id
end
到Cart.rb模型:
将attr_reader:项目更改为attr_accessor :items
def remove_inventory(inventory)
@items.delete_if {|item| item.inventory == inventory }
end
至inventories_controller.rb:
def remove_cart_item
inventory = Inventory.find(params[:id])
@cart = find_cart
@cart.remove_inventory(inventory)
redirect_to_index("The item was removed")
end