【问题标题】:Rails: undefined method `total_price' for nil:NilClassRails:nil:NilClass的未定义方法“total_price”
【发布时间】:2011-05-12 22:56:04
【问题描述】:

我正在使用 Rails 3.0.4 构建一个音乐会门票销售应用程序,主要使用敏捷 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”通知。

“购物车”对象在途中某处被设置为 nil,但删除了

Cart.destroy(session[:cart_id])

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

有人知道这个菜鸟的线索吗?

【问题讨论】:

  • 问题出在关联上。正如@muffinista 所发布的,您需要设置它。 @order = current_cart.build_order(params[:order]) 应该可以解决问题。你是什​​么意思它以某种方式弄乱了通知?你期待什么,你得到了什么?

标签: ruby-on-rails activemerchant


【解决方案1】:

看起来 Cart 对象实际上并未在 belongs_to 关系中指定,您需要执行 @order.cart = current_cartcurrent_cart.order = Order.new 或类似的操作。

【讨论】:

  • 事实证明,“@order = current_cart.build_order(params[:order])” 不是什么弄乱了通知,而是购买方法中的一些东西。当我在控制器中有“@order.save && @order.purchase”时,通知文本 (order_received.text.erb) 在 处产生一个空格,而只有“ @order.save" 订单项已正确呈现。
  • 我会检查 line_items 现在是否正确填充。从您包含的任何一种方式的代码中都不清楚。
  • WEBrick 似乎表明它们是:“OrdersController#create as HTML 处理...[36mLineItem Load (0.0ms)←[0m ←[[imSELECT "line_items".* FROM "line_items" WHERE ("line_items".order_id = 248)←[0m"。另外,我认为订单模型中的以下代码可能是相关的: def add_line_items_from_cart(cart) cart.line_items.each do |item| item.cart_id = nil line_items
  • 你应该明确地检查它们是否被添加和/或保存到数据库中。您的输出中没有任何内容可以确认这一点。
  • 仅当从 if 子句中删除购买方法并且注释掉“@order = current_cart.build_order(params[:order])”时,它们才会保存到数据库中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多