1

保護された属性を一括割り当てできません:password、password_confirmation


これらのフィールドは両方ともデータベースにマップされていません。これらは、いくつかの優れた検証を有効にするために使用したい形式のフィールドにすぎません。

これが私のモデルクラスです:

class User < ActiveRecord::Base
  attr_accessible :email, :password_hash, :password_salt
  attr_accessor :password, :password_confirmation

  before_save :encrypt_password

  validates_confirmation_of :password
  validates :password, presence: true
  validates :email, presence: true

  def encrypt_password
    if password.present?
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end
end

attr_accessorメソッドを配置することで、それらはpassword一括割り当てされないという印象を受けましたが、ここではこの小さな問題が発生しています。password_confirmation

助言がありますか?

これが私の移行フィールドです。データベースに実際にどのフィールドがあるかを確認できます。

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :email
      t.string :password_hash
      t.string :password_salt

      t.timestamps
    end
  end
end

ここで何が欠けていますか?

4

2 に答える 2

2

attr_accessibleは、一括割当を介して設定できるモデル属性のホワイトリストを指定します。 attr_accessorは、インスタンス変数(@name)とそれに対応するアクセスメソッドを作成して読み取ります。また、属性を設定するためにname=というメソッドを作成します。

class User < ActiveRecord::Base
  attr_accessible :email, :password, :password_confirmation
  attr_accessor :password

  before_save :encrypt_password

  validates_confirmation_of :password
  validates_presence_of :password, :on => :create
  validates :email, presence: true

  def encrypt_password
    if password.present?
      self.password_salt = BCrypt::Engine.generate_salt
      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
    end
  end
end
于 2013-01-08T15:16:13.307 に答える
1

attr_accessibleに:password_confirmation:password を追加する必要があります

于 2013-01-08T15:09:08.180 に答える