2017-02-21 73 views
1

我有用戶模型和控制器,用戶有password,password_confirmationpassword_digest字段。我曾用bcrypt紅寶石寶石。Rails-無法保存用戶密碼bcrypt

當我創建用戶時,我提供了上述所有字段並創建了用戶。但用戶的password不會被保存,它將以十六進制格式保存在password_digest字段中。

如果我想編輯只是用戶的名字,當我打開編輯用戶表單時,表格有passwordpassword_confirmation字段爲空。我不得不再次給一個新的密碼來保存我不想要的用戶。

attr_accessor沒有幫助。

這裏是我的用戶的控制器:

before_filter :authorize 

    def create 
    @user = User.new(user_params) 
    if @user.valid? 
    @user.password = params[:user][:password] 
    @user.password_confirmation = params[:user][:password_confirmation] 
    @user.save! 
    redirect_to users_path 
    else 
    flash[:error] = @user.errors.full_message 
    render :new 
    end 
    end 

    def edit 
    @user = User.find(params[:id]) 
    end 

    def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(user_params) 
    redirect_to user_path 
    else 
    render 'edit' 
    flash[:error] = @user.errors.full_messages 
    end 
    end 

    private 
    def user_params 
    params.require(:user).permit(:first_name, :last_name, :emp_id, :email, :password, :password_confirmation) 
    rescue 
    {} 
    end 

繼承人我的用戶模型:

class User < ApplicationRecord 
rolify 
require 'bcrypt' 
has_secure_password 
# other field validations here.... 
validates :password, presence: true 
validates :password_confirmation, presence: true 
end 

和編輯形式:

<%#= other fields here..... %> 
<%= f.label :Password_for_this_portal %> 
<%= f.password_field :password, :class=>"form-control" %> 
<%= f.label :Confirm_passsword_for_this_portal %> 
<%= f.password_field :password_confirmation, :class=>"form-control" %> 
# ..... submit button here 

如何不爲編輯密碼更改再問用戶表單?

+0

這就是它的應該工作,你不會將密碼保存在數據庫中。它出於安全原因被保存爲摘要。 – trueinViso

+0

你永遠不會保存實際的密碼,只能摘要。這樣,如果你的數據庫被黑客攻擊,黑客就無法恢復用戶密碼來推斷其他服務的密碼。 – Maxence

回答

1

has_secure_password旨在驗證passwordpassword_digest。然而,在Rails的4.x中,有一個選項來禁用password與被驗證:

class User < ApplicationRecord 
    has_secure_password :validations => false 
end 

你可能只能夠在create進行驗證,如:

validates :password, presence: true, :on => :create 
validates :password_confirmation, presence: true, :on => :create 
+0

謝謝香農,如果我想驗證兩種方法,說:「刪除」和「創建」,「:開」不適用於兩種方法。 – suhasa