0

Rails を使用したアジャイル Web 開発の第 4 版という本で Rails を学んでいます。

以下の移行のコードを考えると:

class CombineItemsInCart < ActiveRecord::Migration
  def up
    Cart.all.each do |cart|
      sums = cart.line_items.group(:product_id).sum(:quantity)

      sums.each do |product_id, quantity|
        if quantity > 1
          cart.line_items.where(product_id: product_id).delete_all
          cart.line_items.create(product_id: product_id, quantity: quantity)
        end
      end
    end
  end

  def down
    LineItem.where("quantity>1").each do |line_item|
      line_item.quantity.times do
        LineItem.create(cart_id: line_item.cart_id, product_id: line_item.product_id, quantity: 1)
      end
      line_item.destroy
    end
  end
end

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

==  CombineItemsInCart: migrating =============================================
rake aborted!
An error has occurred, this and all later migrations canceled:

Can't mass-assign protected attributes: quantity/home/richard/projects/pickaxe/mini-projects/depot-app/db/migrate/20130607003533_combine_items_in_cart.rb:9:in `block (2 levels) in up'
/home/richard/projects/pickaxe/mini-projects/depot-app/db/migrate/20130607003533_combine_items_in_cart.rb:6:in `each'
/home/richard/projects/pickaxe/mini-projects/depot-app/db/migrate/20130607003533_combine_items_in_cart.rb:6:in `block in up'
/home/richard/projects/pickaxe/mini-projects/depot-app/db/migrate/20130607003533_combine_items_in_cart.rb:3:in `each'
/home/richard/projects/pickaxe/mini-projects/depot-app/db/migrate/20130607003533_combine_items_in_cart.rb:3:in `up'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

attr_accessible がデフォルトで必要になる前にこの本が書かれたことをどこかで読んだことがありますが、それを適切に使用する方法についてはまだ触れていません。Cart モデルの attr_accessible 行に :line_item または :line_items を追加しようとしましたが、うまくいきません。

誰かがここで何が起こっているかを教えてくれますか?

4

3 に答える 3

1

保護された属性を一括割り当てできません: 数量

attr_accessible :quantity を試してください

そのリストにすべての属性をリストする必要があります。

于 2013-06-07T01:04:20.877 に答える
0

属性にアクセスできるようにする必要があります。モデルでは:

class Object ActiveRecord::Base
  attrib_accessible :attrib1, :attrib2, :attrib3
end

明らかに、attrib1 などをモデルの属性に置き換えます。

于 2013-06-07T01:06:11.447 に答える