具有Rails的敏捷Web开发(第4版)购物车问题

时间:2012-05-08 23:59:27

标签: ruby-on-rails controller functional-testing cart nomethoderror

我正在使用Agile Web Dev w / Rails的书(第4版),我完全陷入困境...... 我在Mac OSX上运行Rails 3.2.3。 我在任务D-3:添加一个按钮 ....它从测试开始:函数在本章末尾没有工作......它给了我一个错误说:

Can't Mass assign protected attributes: product

我遵循了这里给出的建议:http://forums.pragprog.com/forums/148/topics/10565

并将Line_Items_Controller中的代码行更改为

@line_item = @cart.line_items.build
@line_item.product = product 

以下是我当前的Line_Items_Controller创建方法:

# POST /line_items

def create
@cart = current_cart
product = Product.find(params[:product_id])
@line_item = @cart.line_items.build
@line_item.product = product

respond_to do |format|
  if @line_item.save
    format.html { redirect_to(@line_item.cart,
      :notice => 'Line item was successfully created.') }
    format.xml  { render :xml => @line_item,
      :status => :created, :location => @line_item }
  else
    format.html { render :action => "new" }
    format.xml  { render :xml => @line_item.errors,
      :status => :unprocessable_entity }
  end
end
end

现在我收到了这个奇怪的消息:

NoMethodError in LineItemsController#create undefined method `product=' for   <LineItem:0x000001024f7fb0>

这是我的LineItem模型

   class LineItem < ActiveRecord::Base
  attr_accessible :cart_id, :product_id, :product
end

我现在还不确定该做什么,因为我是一个完整的Rails(&amp; Ruby)newb。 有人能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:2)

更改原始代码行 @line_item = @cart.line_items.build(product: product) @line_item = @cart.line_items.build(:product_id => product.id) line_items_controller.rb {{1}}为我解决了这个问题。

答案 1 :(得分:1)

就我而言,LineItem中的product_id为attr_accessible:

attr_accessible :cart_id, :product_id

所以我改变了:product =&gt; build的产品属性为:product_id =&gt; product.id,它的工作原理。

@line_item = @cart.line_items.build(:product_id => product.id)

答案 2 :(得分:1)

如果您希望本书中的示例完全按照他们输入的方式工作,请转到models / line_item.rb并添加attr_accessible看起来像这样;

attr_accessible :cart_id, :product_id, :product

n'joy。

答案 3 :(得分:0)

您的订单项模型与Product没有ActiveRecord关联。我不确定你在建造什么,但我认为你会想要:

#lineitem
belongs_to :produce

#product
has_many :line_items

您还需要将product_id添加到订单项表格中。