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

Ale*_*dre 3 activerecord ruby-on-rails

移民

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

      t.timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

模型

class User < ActiveRecord::Base
  attr_accessible :name, :password_digest
  validates :name, :presence => true, :uniqueness => true
  has_secure_password
end
Run Code Online (Sandbox Code Playgroud)

用户注册_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'
Run Code Online (Sandbox Code Playgroud)

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

ActiveModel::MassAssignmentSecurity::Error in UsersController#create

Can't mass-assign protected attributes: password, password_field
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Mat*_*tzi 5

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

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

attr_accessible :name, :password_field, :password
Run Code Online (Sandbox Code Playgroud)

此外,password_digest在任何情况下都不应该可以修改,即计算字段而不是用户输入.