在定义方法时,我无法从另一个模型访问关联模型。在关联对象(line_item)中尝试访问对象属性(大小的“价格”属性)时出现以下错误。以下是我的代码和错误:
楷模
class LineItem < ActiveRecord::Base
attr_accessible :cart_id, :product_id, :quantity, :unit_price, :product, :cart, :color_id, :size_id, :extra_id, :color, :size, :extra
belongs_to :cart
belongs_to :product
has_one :color
has_one :size
has_one :extra
validates :quantity, :presence => true
def item_price
if size.price.nil? || size.price == 0
if extra.price.nil? || extra.price ==0
product.price
else
product.price + extra.price
end
else
if extra.price.nil? || extra.price == 0
product.price + size.price
else
product.price + size.price + extra.price
end
end
end
def full_price
unit_price * quantity
end
end
class Size < ActiveRecord::Base
attr_accessible :name, :price, :product_id, :line_item_id
belongs_to :product
belongs_to :line_item
def size_display
"#{name} +#{price}"
end
end
控制器
class LineItemsController < ApplicationController
def new
@line_item = LineItem.new
end
def create
@line_item = LineItem.create!(params[:line_item].merge(:cart => current_cart))
@line_item.update_attributes!(:unit_price => @line_item.item_price)
redirect_to current_cart_url
end
end
错误
NoMethodError at /line_items
undefined method `price' for nil:NilClass
LineItem#item_price
app/models/line_item.rb, line 10
LineItemsController#create
app/controllers/line_items_controller.rb, line 7
任何见解表示赞赏。
更新
通过分析我的请求参数,我的 size 对象似乎不是 nil,这可能是什么原因造成的?
更新号 2
从控制台找到好的调试信息:
1.9.3-p125 :008 > debugAttempt = LineItem.first
LineItem Load (0.9ms) SELECT "line_items".* FROM "line_items" LIMIT 1
=> #<LineItem id: 1, unit_price: nil, product_id: 1, cart_id: 1, color_id: 1, size_id: 2, extra_id: nil, quantity: 2, created_at: "2013-06-25 03:41:27", updated_at: "2013-06-25 03:41:27">
1.9.3-p125 :009 > debugAttempt.size
Size Load (0.3ms) SELECT "sizes".* FROM "sizes" WHERE "sizes"."line_item_id" = 1 LIMIT 1
=> nil
1.9.3-p125 :010 > debugAttempt.size_id
=> 2
1.9.3-p125 :015 > Size.find(debugAttempt.size_id).price.round
Size Load (0.6ms) SELECT "sizes".* FROM "sizes" WHERE "sizes"."id" = $1 LIMIT 1 [["id", 2]]
=> 50
所以基本上 size 不是 nil 而是我找不到从 lineItem 对象访问关联的 size 对象。我只能访问 size_id。
关于如何解决这个问题的任何想法?