読者です 読者をやめる 読者になる 読者になる

RailsによるアジャイルWebアプリケーション開発第4版 9章 ボタンの追加でのエラーと解決法

Ruby on Rails

RailsによるアジャイルWebアプリケーション開発第4版で解決するのに苦労した部分が出てきたのでメモ.P107の機能テスト
depot>rake test:functionals
を実行したところ

# Running tests:

 

.......E......E.....E.

 

Finished tests in 0.385205s, 57.1124 tests/s, 77.8806 assertions/s.

 

  1) Error:

test_should_create_line_item(LineItemsControllerTest):

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: product

中略

 

  2) Error:

test_should_create_product(ProductsControllerTest):

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: title, description, image_url, price

中略

 

 3) Error:

test_should_update_product(ProductsControllerTest):

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: title, description, image_url, price

このようなエラーメッセージが.ググってみたところ9章のこの部分でエラーの報告をしている方が多くいたので参考にさせてもらった.
一つ目のエラーは『RailsによるアジャイルWebアプリケーション開発 第4版』"9.3 イテレーションD3:ボタンの追加" で rake test:functionals するとエラーになる件を参考にさせてもらった.

・depot/app/controllers/line_items_controller.rb

修正前

  def create

    @cart = current_cart

    product = Product.find(params[:product_id])

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

修正後 

  def create

    @cart = current_cart

    product = Product.find(params[:product_id])

    #@line_item = @cart.line_items.build(product: product)

    @line_item = @cart.line_items.build

    @line_item.product = product

 

二つ目と三つ目のエラーはstackoverflow を参考にした.
・depot/app/models/product.rb
修正前

class Product < ActiveRecord::Base

  has_many :line_items
修正後

class Product < ActiveRecord::Base

  attr_accessible :description, :image_url, :price, :title

  has_many :line_items

すると

# Running tests:

 

......................

 

Finished tests in 0.378819s, 58.0752 tests/s, 92.3924 assertions/s.

 

22 tests, 35 assertions, 0 failures, 0 errors, 0 skips

テスト通った.でも理由はよく分からない.分かる人がいたら教えて.