我将购物车存储在数据库中,并在我的应用程序帮助程序中使用current_cart
方法。
private
def current_cart
Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
cart = Cart.create
session[:cart_id] = cart.id
cart
end
每个购物车has_many line_items。当客户准备结账时,他们会被发送到order/new
...当订单从支付网关返回成功时,一切都很好。但是我正在测试订单失败,似乎我的create
控制器出现了问题,因为@order
对象没有被保存,而rails正在尝试再次呈现order#new
。它甚至没有尝试看看付款是否成功。我不确定出了什么问题,因为几天前我测试时它正在工作。
def create
@order = current_cart.build_order(params[:order])
@order.ip_address = request.remote_ip
@order.total_tokens = @order.calculate_total_tokens
@order.user_id = current_user
if @order.save
if @order.purchase
render :action => "success"
else
render :action => "failure"
end
else
render :action => "new"
end
end
def new
@cart = current_cart
if @cart.line_items.empty?
redirect_to store_url, :notice => "Your cart is empty."
return
end
@order = Order.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @order }
end
end
我在尝试渲染页面时遇到此错误,显然是因为订单尚未保存:
NoMethodError in Orders#create
Showing /Users/justin/Code/trackable/app/views/orders/_order_cart.html.erb where line #1 raised:
undefined method `line_items' for nil:NilClass
Extracted source (around line #1):
1: <% unless @cart.line_items.empty? %>
2: <div id="checkout_cart">
3: <% @cart.line_items.each do |l| %>
4: <%= l.quantity %>
不确定发生了什么
答案 0 :(得分:0)
因此,将@cart = current_cart
添加到#create控制器似乎解决了问题。 ActiveMerchant抛出一个验证错误,出于某种原因,当它这样做时,它正在丢失@cart
...当我测试ActiveRecord验证时它没有那么早,所以我还是不太确定是什么我改变了一切搞砸了。