【问题标题】:Rails db:migrate cannot mass assign protected attributesRails db:migrate 无法批量分配受保护的属性
【发布时间】:2013-06-03 04:50:31
【问题描述】:

我正在通过《Agile Web Development with Rails 4th edition》一书学习 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 之前编写的,但它还没有真正涉及如何正确使用它。我尝试将 :line_item 或 :line_items 添加到 Cart 模型中的 attr_accessible 行,但没有成功。

有人可以告诉我这里发生了什么吗?

【问题讨论】:

    标签: ruby-on-rails ruby database rake dbmigrate


    【解决方案1】:

    您尝试从迁移中访问质量属性。当您想从代码中访问数据库表属性时,您需要允许批量分配该属性以告诉您的模型您可以通过代码为字段分配数据。对于这个目的,只需将所需字段添加为 attr_accessible ,针对您的问题的特定解决方案如下:

    类 LineItem

    attr_accessible :quantity, :product_id, :cart_id

    结束

    【讨论】:

      【解决方案2】:

      您需要使属性可访问。在模型中:

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

      显然,您会用模型的属性替换 attrib1 等。

      【讨论】:

      • 这对我来说没有意义。
      • 我不知道您的型号名称,也不知道它具有的属性,所以我做了一个通用示例。基本上它与您接受的答案相同。
      【解决方案3】:

      无法批量分配受保护的属性:数量

      尝试 attr_accessible :数量

      您需要列出该列表中的所有属性。

      【讨论】:

      • 没关系,问题出在 LineItem 模型上。我做了你对那个模型的建议。我认为问题出在购物车模型上。感谢您的帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多