Rails:nil的未定义方法`total_price':NilClass

时间:2011-05-12 22:56:05

标签: ruby-on-rails activemerchant

我正在使用Rails 3.0.4构建音乐会门票销售应用程序,主要使用Agile Web开发教程(http://pragprog.com/titles/rails3/agile-web-development-with-rails)和试图纳入Ryan Bate的订单购买方法(http://railscasts.com/episodes/146-paypal-express-checkout)。在orders_controller.rb中,一切都可以使用以下内容:

def create
  @order = Order.new(params[:order])
  @order.add_line_items_from_cart(current_cart)
  @order.ip_address = request.remote_ip 

  respond_to do |format|
    if @order.save
  Notifier.order_received(@order).deliver
  format.html { redirect_to(calendar_url, :notice => 'Thank you for your order.') }
      format.xml  { render :xml => @order, :status => :created, :location => @order }
  Cart.destroy(session[:cart_id])
  session[:cart_id] = nil
else
  format.html { render :action => "new" }
      format.xml  { render :xml => @order.errors, :status => :unprocessable_entity }
end
  end

但是当我在条件子句中添加“&& @ order.purchase”时,order.rb模型如下:

class Order < ActiveRecord::Base
  #...
  belongs_to :cart
  #...

  def price_in_cents
    (cart.total_price*100).round
  end

  def purchase
    response = GATEWAY.purchase(price_in_cents, credit_card, purchase_options)
    cart.update_attribute(:purchased_at, Time.now) if response.success?
    response.success?
  end
  #...
end

我收到nil:NilClass的“未定义方法`total_price”错误。我可以通过添加

解决这个问题
@order = current_cart.build_order(params[:order])

命令“create”方法,但这会以某种方式阻止相关订单信息(在本例中为“@ order.line_items”)在电子邮件文本中呈现,从而弄乱“order_received”通知。

“cart”对象在整个过程中被设置为nil,但删除了

Cart.destroy(session[:cart_id])

从命令“创建”方法无法解决问题。

任何人都有这个菜鸟的线索吗?

1 个答案:

答案 0 :(得分:0)

看起来好像在belongs_to关系中实际指定了Cart对象,您需要执行@order.cart = current_cartcurrent_cart.order = Order.new,或者沿着这些行。