1

私は、チェックアウトの第12章の途中で、いくつかの小さな変更を加えたアジャイルWeb開発の本のチュートリアルに従っています。

次のエラーが発生します。

NoMethodError (undefined method `price=' for #<LineItem:0x00000103a0de18>):
app/models/cart.rb:11:in `add_deal'
app/controllers/line_items_controller.rb:45:in `create'

これが私のカートモデルです:

class Cart < ActiveRecord::Base
# attr_accessible :title, :body
has_many :line_items, dependent: :destroy

def add_deal(deal_id)
  current_item = line_items.find_by_deal_id(deal_id)
  if current_item
    current_item.quantity += 1
  else
    current_item = line_items.build(deal_id: deal_id)
    current_item.price = current_item.deal.price
  end
current_item
end
def total_price
  line_items.to_a.sum { |item| item.total_price }
end
end

これがline_items_controllerのcreateアクションで、関連する45行目がフリーズしています。

def create
  @cart = current_cart
  deal = Deal.find(params[:deal_id])
  @line_item = @cart.add_deal(deal.id)

私の広告申込情報モデル:

class LineItem < ActiveRecord::Base
attr_accessible :cart_id, :deal_id, :quantity
belongs_to :order
belongs_to :deal
belongs_to :cart

def total_price
  deal.price * quantity
end
end

これが私の取引モデルです:

class Deal < ActiveRecord::Base
  attr_accessible :description, :expiration, :featured, :image_url, :inventory, :price, :sold, :title, :value, :deal_id

has_many :line_items

before_destroy :ensure_not_referenced_by_any_line_item

validates :price, numericality: {greater_than_or_equal_to: 0.01}
validates :title, uniqueness: true
validates :title, :description, :image_url, presence: true

private

# ensure that there are no line items referencing this product
def ensure_not_referenced_by_any_line_item
  if line_items.empty?
    return true
  else
    errors.add(:base, 'Line Items present')
    return false
  end
end
end

コンソールを使用してみたところ、item.deal.priceは問題なく機能しますが、item.priceは機能しません。

line_itemモデルでは、attr_accessible:priceを試しましたが、何も修正されませんでした。

コードと本を確認しましたが、大きな違いはまったくわかりません。

1つのアイデアは、LineItemsの価格のデータベースフィールドを設定することですが、本はそれを行わず、DRYの原則に違反しています。

私は何時間もソースコードをじっと見つめていて、何も悪いことを見つけることができないので、どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

0

あなたはその本を読んでいる間に気を取られました。LineItemモデルにはフィールドが含まれていpriceます。Product将来的にaの価格が変更される可能性があり、LineItemモデルが取引の履歴として表示されるため、これはDRYの原則に完全に準拠しています。

于 2012-04-16T16:52:48.747 に答える