ActiveRecord:默认情况下受保护的属性.他们怎么可以公开?

ice*_*ice 1 attributes ruby-on-rails rails-activerecord

我刚开始使用rails进行编码.我正在使用:Rails 3.2.8 ruby​​ 1.9.3p194

我创建了一个迁移和相应的模型,所有这些都在它们应该存在的文件中(为了简洁起见,我将它们全部展示在一起):

class CreateMovies < ActiveRecord::Migration
  def up
    create_table 'movies' do |t|
    t.string 'title'
    t.timestamps
  end
end

def down
  drop_table 'movies'
end
end


class Movie < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)

所以,我想进入'rails console'并将数据库作为学习过程.

这是我输入的内容和我收到的错误消息:

1.9.3p194 :021 > k = Movie.new(:title => 'coco')
 ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: title
Run Code Online (Sandbox Code Playgroud)

我必须说如果我追加上述语句就可以正常工作:without_protection => true.

我抬头看了一下质量任务,我明白这是我们应该非常小心的事情.但是,似乎rails默认激活了质量分配保护.在我的情况下,我想使用哈希创建条目,这对调试和学习非常有用!

有没有办法去除这种保护?我想默认拥有公共属性!我怎样才能做到这一点?

奇怪的是,在我的网络研究中,我得出结论,默认情况下此功能不存在,即默认情况下ActiveModel不会创建受保护的属性.(http://stackoverflow.com/questions/3764899/is-there-a-way-to-make-rails-activerecord-attributes-private)但在我的情况下,所有属性都是私有的!

在我的代码中,将来,我应该尝试单独分配所有属性吗?这将是乏味的.是否有更好的方法来保护安全并避免这个繁琐的过程?

提前感谢您的心灵深处!

Rya*_*igg 14

没有!请不要取消激活此保护.这非常有助于阻止人们设置他们不应该的属性.关掉它是一个非常糟糕的主意,我非常非常强烈地建议反对它.

您应该在模型中执行此操作:

class Movie < ActiveRecord::Base
  attr_accessible :title
end
Run Code Online (Sandbox Code Playgroud)

这将使只是title属性为您的Movie对象分配,没有别的能没有被分配without_protection标志或config.active_record.whitelist_attributes设置为设置false.

如果你不注意这个警告,那么Murifox的回答就是你想要的.


想象一下,您有一个表单,用户可以更新其密码.天真无邪.现在假设您已关闭属性保护,并且您的users表上有一个admin字段.

实际上,有人非常容易将页面的HTML保存到他们的计算机,添加一个字段admin然后将其设置为"on"或其他任何内容,然后blammo,他们是您网站的管理员.

您网站的新管理员可以快速有效地对您的应用程序进行政变,使他们声称的"异议数据"消失.在未来几年,这个野蛮的独裁者以某种方式积聚了足够的核材料以形成核武器.他与一个鲜为人知的国家并不相处,比如说苏里南,并向他的军队发起进攻.军队是如何形成的,取决于你的想象力.

成千上万的苏里南人(我不得不抬头看看)要么被杀,要么被迫流入邻国,主要是法国几内亚和圭亚那.一些尝试,使其向巴西的一个,如果不是南美洲最大的国家,只能通过在丛林中徒步旅行或生物的绝对距离被杀死.

剩下的苏里南军队坚持反对独裁者和他的军队.使用核武器打破了僵局,独裁者将苏里南及其民众的生活添加到他已毁坏的事物清单中.这个清单很短:他毁掉的唯一一件事就是你的申请.

你想要那个意识吗?! 为什么没有人会想到苏里南的属性?!

拜托,求求,请使用attr_accessible.学会喜欢它,否则后果可能会非常可怕.