我已经使用了宁静的技术来生成一个模型(实际上,我正在使用Devise Gem,为我做到这一点),并且我在模型中添加了称为first_name和last_name的新字段。迁移很好。我在模型中添加了attr_accessor:first_name,:last_name,并期望它可以正常工作。但是,当我尝试使用Doctor.create({:first_name =>" myname"})等大规模分配新实例时,我会遇到错误,说我不能大规模分配受保护的属性。

我认为使用atter_accessor的全部要点是绕过模型场的受保护性。您能帮我理解这个信息吗?

编辑:哦,顺便说一句,记录也不会被创建。

edit2:这是我的模型

class Doctor < User
  has_many :patients
  has_many :prescriptions, :through=> :patients

  validates_presence_of :invitations, :on => :create, :message => "can't be blank"

  attr_accessor :invitations
end

和没有first_name和last_name的模式,因为它们是在用户表中创建的,该表是医生的祖先。我使用了单个表继承。

create_table :doctors do |t|
  t.integer :invitations

  t.timestamps
end

这是更改用户表的迁移

add_column :users, :first_name, :string
add_column :users, :last_name, :string
add_column :users, :type, :string

编辑:这是种子文件。我不包括truncate_db_table方法,但它起作用。

%w{doctors patients}.each do |m|
  truncate_db_table(m)  
end  

Doctor.create(:invitations=>5, :email=>"[email protected]", :first_name=>"Name", :last_name=>"LastName")
Patient.create(:doctor_id=>1, :gender=>"male", :date_of_birth=>"1991-02-24")

答案

不要混淆attr_accessorattr_accessible。访问器内置在Ruby中,并定义了Getter方法 - model_instance.foo # returns something - 和一个二阶方法 - model_instance.foo = 'bar'

可访问是由导轨定义的,并使属性质量分配(与attr_protected)。

如果first_name是模型数据库表中的一个字段,然后Rails已经为该属性定义了Getters和Setters。您需要做的就是添加attr_accessible :first_name

来自: stackoverflow.com