无法在Rails 3.2.3中大量分配受保护的属性

时间:2012-08-10 10:08:32

标签: ruby-on-rails activerecord

迁移

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :password_digest

      t.timestamps
    end
  end
end

模型

class User < ActiveRecord::Base
  attr_accessible :name, :password_digest
  validates :name, :presence => true, :uniqueness => true
  has_secure_password
end

用户注册_form

.main_form
  = form_for @user do |f|

    %div
      = f.label :name
      = f.text_field :name, :size=>40

    %div
      = f.label :password, "Password"
      = f.password_field :password

    %div
      = f.label :password_confirmation, "Confirmation"
      = f.password_field :password_field

    %div
      = f.submit 'Create user'

当我尝试注册新用户时,它会抛出异常

ActiveModel::MassAssignmentSecurity::Error in UsersController#create

Can't mass-assign protected attributes: password, password_field

我做错了什么?

1 个答案:

答案 0 :(得分:5)

您应该将这两个字段添加到has_accessible列表中。 Rails不仅保护数据库字段不受大规模分配的影响,还保护所有字段,例如这些“虚拟”字段。

在用户模型中(而不是attr_accesible行):

attr_accessible :name, :password_field, :password

此外,password_digest在任何情况下都不可用于修改,即计算字段而非用户输入。