当前位置:  开发笔记 > 后端 > 正文

"警告:无法批量分配受保护的属性"

如何解决《"警告:无法批量分配受保护的属性"》经验,为你挑选了2个好方法。

我已经使用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_accessorattr_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.



1> Robert Speic..:

不要混淆attr_accessorattr_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.



2> boulder_ruby..:

以不安全的方式将您的应用程序一起破解,完全不适合生产模式:

转到/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


即使有了"早期编码"的警告,这也是非常糟糕的建议.开发人员何时有机会返回并重构整个应用程序?从一开始就做好.
"请记住,这是一个安全漏洞,但你可以在以后处理它"你什么时候打算处理它?后来,什么时候投入生产?我刚刚补充说"你对attr_accessible有什么看法?" 到我的面试问题清单.
推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有