pic*_*rdo 67 activerecord ruby-on-rails devise
我已经使用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
Run Code Online (Sandbox Code Playgroud)
和模式,它没有first_name和last_name,因为它们是在users表中创建的,这是医生的祖先.我使用单表继承.
create_table :doctors do |t|
t.integer :invitations
t.timestamps
end
Run Code Online (Sandbox Code Playgroud)
这是用于更改users表的迁移
add_column :users, :first_name, :string
add_column :users, :last_name, :string
add_column :users, :type, :string
Run Code Online (Sandbox Code Playgroud)
编辑:这是种子文件.我不包括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")
Run Code Online (Sandbox Code Playgroud)
Rob*_*her 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.
bou*_*uby 11
以不安全的方式将您的应用程序一起破解,完全不适合生产模式:
转到/config/application.rb向下滚动到您可以找到的末尾
{config.active_record.whitelist_attributes = true}
Run Code Online (Sandbox Code Playgroud)
将其设置为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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
98499 次 |
| 最近记录: |