如果我尝试执行以下代码:
hassle = rota.hassles.create(:sender => user1, :receiver => user2, :type => "sms")
我得到以下错误:
Failure/Error: hassle = rota.hassles.create(:sender => user1, :receiver => user2, :type => "sms")
ActiveModel::MassAssignmentSecurity::Error:
Can't mass-assign protected attributes: type
我不确定这意味着什么。我已将 :type 设为强制,所以如果我删除它,我会收到一个 sql 错误。
最佳答案
一些事情:
批量分配通常意味着将属性传递到创建对象的调用中,作为属性散列的一部分。也就是说,您将散列中的一堆属性传递到创建新对象的调用中。例如:
@user = User.create({:name => "My name", :user_type => "nice_user"})
但是,Rails 包含一些基本的安全规则,这意味着默认情况下并非所有属性都可以通过这种方式分配。您必须事先指定哪些可以。你这样做:
class User < ActiveRecord::Base
attr_accessible :name, :user_type
end
如果不指定属性是
attr_accessible
,然后将其传入以创建对象,则会收到您发布的错误。以下是更多详细信息:
http://api.rubyonrails.org/v3.2.9/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html
另一种方法是在您第一次创建记录时设置一些属性,然后设置其他属性——像这样:
# In this example `user_type` is not attr_accessible so it needs to be set specifically
@user = User.create({:name => "My name"})
@user.user_type = "nice_user"
@user.save
此外,如果您在使用列名
type
时遇到问题由于 rails 感到困惑并认为您想使用单表继承 (STI),请查看此问题的答案以了解如何解决此问题:http://guides.rubyonrails.org/
关于ruby-on-rails - ActiveModel::MassAssignmentSecurity::Error: 无法批量分配 protected 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10574957/