添加购物车项目 Ruby on Rails
Posted
技术标签:
【中文标题】添加购物车项目 Ruby on Rails【英文标题】:Adding Cart items Ruby on Rails 【发布时间】:2012-10-19 07:44:57 【问题描述】:我正在开发一个非常基本的购物车,我遇到的问题是,如果我将多个相同的产品添加到我的购物车中,我并没有看到数量增加,而只是看到了该商品的多个版本.
例如我看到:
1 x 绿灯 = 15 英镑 1 x 绿灯 = 15 英镑
而不是看到:
2 x 绿灯 = 30 英镑
我怎样才能让我的购物车检查购物车中的多个版本,然后将它们添加到一起?
目前我有:
应用程序控制器
def current_cart
if session[:cart_id]
@current_cart ||= Cart.find(session[:cart_id])
end
if session[:cart_id].nil?
@current_cart = Cart.create!
session[:cart_id] = @current_cart.id
end
@current_cart
end
购物车控制器
def show
@cart = current_cart
end
购物车模型
has_many :items
def total_price
items.to_a.sum(&:full_price)
end
购物车视图
<table id="line_items">
<tr>
<th>Product</th>
<th>Qty</th>
<th class="price">Unit Price</th>
<th class="price">Full Price</th>
</tr>
<% for item in @cart.items %>
<tr class="<%= cycle :odd, :even %>">
<td><%=h item.product.name %></td>
<td class="qty"><%= item.quantity %></td>
<td class="price"><%= gbp(item.unit_price) %></td>
<td class="price"><%= gbp(item.full_price) %></td>
</tr>
<% end %>
<tr>
<td class="total price" colspan="4">
Total: <%= gbp(@cart.total_price) %>
</td>
</tr>
</table>
更多信息
产品#索引
<%= link_to "Add to Cart", line_items_path(:product_id => product), :method => :post %>
人们可以提供的任何建议将不胜感激。谢谢!
新设置 - 导致错误Uninitialised Constant CartController
Routes.rb
Checkout::Application.routes.draw do
ActiveAdmin.routes(self)
devise_for :admin_users, ActiveAdmin::Devise.config
post '/add_to_cart/:product_id' => 'cart#add_to_cart', :as => 'add_to_cart'
resources :carts
resources :products
resources :items
root :to => 'products#index'
end
手推车控制器
class CartsController < ApplicationController
def show
@cart = current_cart
end
def add_to_cart
current_cart.add_item(params[:product_id])
redirect_to carts_path(current_cart.id)
end
end
手推车模型
class Cart < ActiveRecord::Base
has_many :items
def add_item(product_id)
item = items.where('product_id = ?', product_id).first
if item
# increase the quantity of product in cart
item.quantity + 1
save
else
# product does not exist in cart
product = Product.find(product_id)
items << product
end
save
end
def total_price
items.to_a.sum(&:full_price)
end
end
产品#索引
<table class="jobs">
<thead>
<tr>
<th scope="col" id="name">Product Code</th>
<th scope="col" id="company">Name</th>
<th scope="col" id="company">Price</th>
<th scope="col" id="company">Action</th>
</tr>
</thead>
<tbody>
<% @product.each do |product| %>
<tr>
<td><%= product.product_code %></td>
<td><%= product.name %></td>
<td><%= gbp(product.price) %></td>
<td><%= button_to "Add to Cart", add_to_cart_path(:product_id => product), :method => :post %></td>
</tr>
<% end %>
</tbody>
</table>
【问题讨论】:
如何添加项目?请显示代码 嗨@Lichtamberg,我已经添加了用于将产品添加到我的购物车的链接 - 我只是通过 post 方法传递 product_id。您可以提供的任何进一步帮助都会很棒!谢谢:) 【参考方案1】:在您的 Cart 模型中,创建一个名为
的方法def add_item(product_id)
item = items.where('product_id = ?', product_id).first
if item
# increase the quantity of product in cart
item.quantity + 1
save
else
# product does not exist in cart
cart.items << Item.new(product_id: product_id, quantity: 1)
end
save
end
在 routes.rb 中,
post '/add_to_cart/:product_id' => 'cart#add_to_cart', :as => 'add_to_cart'
将您的 Add to Cart 路由更改为 Cart 控制器中的 call add_to_cart 方法。
def add_to_cart
current_cart.add_item(params[:product_id])
# redirect to shopping cart or whereever
end
这应该让你知道你想要完成什么。
【讨论】:
嗨@scarver2,我在尝试将我的物品添加到购物篮时似乎遇到了uninitialised constant CartController
错误。我已经更新了上面标题为New Setup
的所有文件。你能看出我哪里错了吗?感谢您的帮助!
如果您有第二个问题,您应该将其作为新问题发布在 SO 上。不要将多个问题打包成一个问题。
感谢您分享更多代码。由于您的控制器和路由是复数的,因此您需要将路由的 to:
部分复数。 post '/add_to_cart/:product_id' => 'carts#add_to_cart', :as => 'add_to_cart'
@scarver2 我似乎有一个最后一个错误是ActiveRecord::AssociationTypeMismatch in CartsController#add_to_cart
和Item(#53915280) expected, got Product(#53895696)
知道这里出了什么问题吗?谢谢!
我编辑了我的答案。将“产品在购物车中不存在”部分更改为上面的新代码。以上是关于添加购物车项目 Ruby on Rails的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails 使用 API 从亚马逊购买商品?