0

我正在阅读 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 (& Ruby) 新手。谁能指出我正确的方向?

4

4 回答 4

2

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

于 2012-05-09T15:50:53.653 回答
1

就我而言,LineItem attr_accessible 中有:product_id:

attr_accessible :cart_id, :product_id

所以我将构建属性中的 :product => product 更改为 :product_id => product.id 并且它可以工作。

@line_item = @cart.line_items.build(:product_id => product.id)
于 2012-07-10T16:44:50.743 回答
1

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

attr_accessible :cart_id, :product_id, :product

高兴。

于 2012-08-21T17:04:01.313 回答
0

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

#lineitem
belongs_to :produce

#product
has_many :line_items

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

于 2012-05-09T03:21:01.307 回答