我正在尝试根据会话构建一个简单的购物车。我使用此youtube教程作为模板:vid#4 https://www.youtube.com/watch?v=WRVwfVUaj_Y和vid#5 https://www.youtube.com/watch?v=HSMqi913SL4。
我得到了与他在vid#5中获得的相同的错误,但是他并没有表明他是如何修复它的。
以下是我的路线:
get '/cart' => 'cart#index'
get '/cart/clear' => 'cart#clearCart'
get '/cart/:id' => 'cart#add'
这是我的cart_controller.rb:
class CartController < ApplicationController
def add
id = params[:id]
if session[:cart] then
cart = session[:cart]
else
session[:cart] = {}
cart = session[:cart]
end
if cart[id] then
cart[id] = cart[id] + 1
else
cart[id] = 1
end
redirect_to :action => :index
end
def clearCart
session[:cart] = nil
redirect_to :action => :index
end
def index
if session[:cart] then
@cart = session[:cart]
else
@cart = {}
end
end
end
这是我的cart / index.html.erb页面:
<h3>Your Shopping Cart</h3>
<%= link_to "Empty Your Cart", cart_clear_path %>
<% total = 0 %>
<% @cart.each do | id, quantity | %>
<% product = Product.find_by_id(id)%>
<div class="row">
<div class="col-lg-3 col-md-3 col-sm-6 col-xs-12" >
<div class="product_text">
<h3><%= product.name %></h3>
<h3><%= product.description %></h3>
<h3>$<%= product.price %></h3>
</div>
</div>
</div>
<%end%>
我很困惑,因为我知道Product对象存在,但我仍然在标题中收到错误。
答案 0 :(得分:1)
您可以尝试在添加
后将购物车变量分配回会话def add
id = params[:id]
cart = session[:cart] || {}
cart[id] = 0 unless cart[id]
cart[id] = cart[id] + 1
session[:cart] = cart
redirect_to :action => :index
end
BTW我不认为是否应该包含在语言中
def index
@cart = session[:cart] || {}
end
我处理产品的方式是在控制器中。我对在视图中看到模型有所保留。我不确定这是否是一种设计模式,但我会将一系列产品传递给视图而不是一组数组来查找。我知道这有助于代码的测试能力。
# app/controllers/cart_controller.rb #should be carts_controller for RAILS convention
def index
@cart = []
session[:cart].each do |product_id, qty|
@cart << {product: Product.find(product_id) , qty: qty}
end
end
仅在@cart.each do |c| <%=c.product.name %> <%=c.qty %>
答案 1 :(得分:0)
感谢大家的帮助,但我找到了解决方案。在我将其传递给find_by_id之前,我需要使用.gsub(&#39;&#39;&#39;&#39;&#39;&#39;)清理ID。
这有效:
<% @cart.each do | id , qty | %>
<% p = Product.find_by_id(id.gsub('"', '')) %>
<%= p.name %> <%= qty %>
<%end%>