1

私はこのビデオチュートリアルに従い、認証を最初から作成する方法を学びます。

http://www.youtube.com/watch?v=O5RDisWr_7Q


これがユーザーの移行ファイルです。

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

そして私のコントローラー:

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:users])
    if @user.save
      redirect_to root_url, :notice => "Signed up!"
    else
      render "new"
    end
  end
end

そして最後に私のモデル:

class User < ActiveRecord::Base
  attr_accessible :email, :password_hash, :password_salt

  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

今、私はこのエラーが発生している理由を知っていると思います。明らかに、@user.save呼び出しはUserテーブルのpasswordフィールドに値を保存しようとしてpasswordいますが、そのフィールドはデータベースに存在しません。ビデオの中で彼は、このバグを修正するには、モデルに次のように追加する必要があると述べています。attr_accessible :passwordモデルに追加すると機能するはずですが、次のエラーが発生します。

UsersController#createのNoMethodError

#の未定義のメソッド `password'

app / controllers / users_controller.rb:8:in `create '

助言がありますか?緩いhtmlフィールドの代わりに、強く型付けされたモデルを使用することに伴う検証を利用したいと思います。

4

1 に答える 1

5

あなたは持っていますが、メソッドで作業する仮想属性が必要なので、一緒にする必要attr_accessible :password_hash, :password_saltがあると思います。それで:attr_accessible :passwordattr_accessor :passwordpasswordencrypt_password

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

attr_accessorデータベースフィールドとして使用できない仮想属性(したがって仮想)を作成します。

attr_accessibleは、次のように一括割り当てで設定できる属性をホワイトリストに登録するためのセキュリティメカニズムです。User.new(params[:users])

于 2013-01-08T14:53:43.303 に答える