0

我正在尝试在 spree 上的产品中添加一个字段,这只是一个复选框,如果它们是待售产品或者它们是内部产品,它只是用来标记产品。

我已经添加了迁移,最后想出了如何在表单上添加复选框,但是当我单击更新时,我得到了Can't mass-assign protected attributes: for_sale

这是迁移

class AddProductForSaleField < ActiveRecord::Migration
  def up
    add_column :spree_products, :for_sale, :boolean
  end
  def down
    remove_column :spree_products, :for_sale
  end
end

这是正在添加的字段

Deface::Override.new(:virtual_path  => "spree/admin/products/_form",
                     :name          => "for_sale",
                     :insert_before => "code[erb-silent]:contains('track_inventory_levels')",
                     :partial       => "spree/admin/products/for_sale")

这是部分

<%= f.field_container :for_sale do %>
    <%= f.label :for_sale, t(:for_sale) %>
    <%= f.check_box :for_sale, { :checked => true } %>
<% end %>
4

3 回答 3

3

明白了,缺少模型部分

Spree::Product.class_eval do 
    attr_accessible :for_sale
end
于 2012-05-30T17:47:06.483 回答
1

Mass Assignment 是 Rails 赋予使用参数​​哈希构造对象的行为的名称。它是“批量赋值”,因为您通过单个赋值运算符将多个值分配给属性。

以下代码片段执行 Post 模型的名称和主题属性的批量分配:

Post.new(:name => "John", :topic => "Something")

Post.create(:name => "John", :topic => "Something")

Post.update_attributes(:name => "John", :topic => "Something")

为了使其工作,您的模型必须允许对您传入的哈希中的每个属性进行批量分配。

有两种情况会失败:

您有一个不包括 :name 的 attr_accessible 声明

你有一个 attr_protected 其中包括 :name

最近,必须通过 attr_accessible 手动将属性列入白名单才能使批量分配成功,这已成为默认设置。在此之前,默认情况下属性是可分配的,除非它们被明确列入黑名单 attr_protected 或任何其他属性被列入 attr_accessible 的白名单。

于 2014-02-21T13:17:43.320 回答
0

如果是权限问题,则可以添加:

Spree::Product.class_eval do 

  attr_accessible :variable_1, :variable_2 :as => [:default, :product]

end

将其标记为特定模型的默认值,将删除批量分配警告消息!

于 2013-12-11T06:13:45.860 回答