我已经使用RESTful技术生成模型(事实上,我正在使用Devise gem,它为我做了这个),并且我在模型中添加了名为first_name和last_name的新字段.迁移进展顺利.我将attr_accessor:first_name,:last_name添加到模型中,并期望它能正常工作.但是当我尝试使用Doctor.create({:first_name =>"MyName"})等大量分配新实例时,我收到错误,说我无法批量分配受保护的属性.
我认为使用attr_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,因为它们是在users表中创建的,这是医生的祖先.我使用单表继承.
create_table :doctors do |t| t.integer :invitations t.timestamps end
这是用于更改users表的迁移
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@gmail.com", :first_name=>"Name", :last_name=>"LastName") Patient.create(:doctor_id=>1, :gender=>"male", :date_of_birth=>"1991-02-24")
Robert Speic.. 140
不要混淆attr_accessor
与attr_accessible
.Accessor内置于Ruby中,定义了一个getter方法model_instance.foo # returns something
- 和一个setter方法model_instance.foo = 'bar'
.
可访问性由Rails定义,并使属性可以分配(与之相反attr_protected
).
如果first_name
是模型数据库表中的字段,则Rails已经为该属性定义了getter和setter.您需要做的就是添加attr_accessible :first_name
.
不要混淆attr_accessor
与attr_accessible
.Accessor内置于Ruby中,定义了一个getter方法model_instance.foo # returns something
- 和一个setter方法model_instance.foo = 'bar'
.
可访问性由Rails定义,并使属性可以分配(与之相反attr_protected
).
如果first_name
是模型数据库表中的字段,则Rails已经为该属性定义了getter和setter.您需要做的就是添加attr_accessible :first_name
.
以不安全的方式将您的应用程序一起破解,完全不适合生产模式:
转到/config/application.rb向下滚动到您可以找到的末尾
{config.active_record.whitelist_attributes = true}
将其设置为false.
EDIT/btw(经过4个月的红宝石密集型工作,包括11周的研讨会):DHH认为,对于noobies(他的话),"up and running"比"非常安全"更重要.
建议:虽然这个答案(我认为我在stackoverflow上的第一个)现在是+6,但它的历史已经低至-4,这意味着许多经验丰富的rails开发人员对于不想要的东西感到非常热情你这样做.
更新:3年后,另一种方法 - 再次,不安全,但比上述解决方案更好可能因为你必须为每个模型做到这一点
class ModelName < ActiveRecord::Base column_names.each do |col| attr_accessible col.to_sym end ... end