2012年6月1日金曜日

Rails3.2.3でCan't mass-assign protected attributes: productと出る。

このエラーが起きるときは、次のようなことがよく考えられます。

・attr_accessibleを消した あるいは変更した(する)可能性がある。



オウム社の「RailsによるアジャイルWebアプリケーション開発 第4版
(英名:Errata for Agile Web Development with Rails (4th edition))」をテストしてて、
P106(英文ではP110)でつまづいたので、メモ。
最近海外の方もよく踏むんで、拙い英語も横につけますw

エラー文(some errors)
can't mass assign protected attributes product

以下部分を変更します。(to convert text)



controllers/line_items_controller.rb

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


以下消してれば追加あるいは加筆 (Add attr_accesible if you don't add)

models/line_item.rb

 attr_accessible :product, :product_id, :quantity, :cart_id, :id

models/product.rb
  attr_accessible :image_url, :description, :price, :title

びっくりしたよ、この本の最初に、
このままで起動できますって文言があるから信じてやってると
急にerrorでつまづいたので。笑

参考
http://d.hatena.ne.jp/CortYuming/20120529/p1
http://pragprog.com/titles/rails4/errata
http://stackoverflow.com/questions/9842385/cant-mass-assign-protected-attributes-attr-accessible-is-set (attr_accessibleセットしてるのに起こったという記事)
http://stackoverflow.com/questions/5467158/warning-cant-mass-assign-protected-attributes

=======================================
追記
P112のline_items_controller.rbも変更します
@line_item = @cart.add_product(product_id)
=> @line_item = @cart.line_items.build(product_id: product.id)