我已经使用了宁静的技术来生成一个模型(实际上,我正在使用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_accessor
和attr_accessible
。访问器内置在Ruby中,并定义了Getter方法 - model_instance.foo # returns something
- 和一个二阶方法 - model_instance.foo = 'bar'
。
可访问是由导轨定义的,并使属性质量分配(与attr_protected
)。
如果first_name
是模型数据库表中的一个字段,然后Rails已经为该属性定义了Getters和Setters。您需要做的就是添加attr_accessible :first_name
。