2013-03-13 75 views
3

在Rails 4應用程序中 - 我試圖在控制檯中創建一個簡單用戶時出現此錯誤。Rails 4 has_secure_password

RuntimeError: 
    Password digest missing on new record 

我的模型,控制器和模式是這樣的:

class User < ActiveRecord::Base # User.rb 
    has_secure_password 
end 

class UsersController < ApplicationController 

    def new 
    @user = User.new 
    end 

def create 
    @user = User.new(user_params) 
    if @user.save 
     redirect_to root_path, notice: "Thank you for signing up!" 
    else 
     render "new" 
    end 
    end 

private 

    def user_params 
    params.require(:user).permit(:email, :name, :password, :password_confirmation) 
    end 
end 

create_table "users", force: true do |t| #db/schema.rb (edited for brevity) 
    t.string "email" 
    t.string "name" 
    t.text  "password_digest" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

我使用PostgreSQL和我不知道這是一個錯誤,或者如果我錯過了一些東西簡單。

感謝,

+0

是否安裝了bcrypt寶石? – 2013-03-13 04:27:24

+0

如果沒有bcrypt,它不會得到那麼多 – 2014-08-23 19:51:25

回答

2

在Rails 4所有的屬性都質量默認分配,這樣你就不需要使用attr_accesible。現在你必須說明你想保護哪些。你會這樣寫它

attr_protected :admin 

當password_digest爲空時,你得到的錯誤會被引發。這可能與你的attr_accesor有關:我能看到你的觀點嗎?

+0

謝謝,它與'attr_accessor'有關。一旦我刪除它,一切正常。 – trev9065 2013-03-13 13:42:08

1

我這麼做是軌道4,5

使用 「has_secure_password」 你必須使用參數password_digest

Schema Information = name :string, password_digest :string 

class User < ActiveRecord::Base 
    has_secure_password 
    validates :name, presence: true, uniqueness: true 
    validates_presence_of :password, :on => :create 
end 

和控制器

def user_params 
    params.require(:user).permit(:name, :password_digest, 
    :password, :password_confirmation) 
end 

def create 
    @user = User.new(user_params) 
    respond_to do |format| 
     if @user.save 
     format.html { redirect_to users_url, notice: "User #{@user.name} was successfully created.'"} 
     format.json { render action: 'show', status: :created, location: @user } 
     else 
     format.html { render action: 'new' } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
end 
1

我確切的問題,但這部分解決了我的問題。該password_confirmation不能保存,因爲它不是一個許可證參數

def user_params params.require(:user).permit(:name, :password_digest, :password, :password_confirmation) end