2017-02-21 17 views
1

私はユーザーモデルとコントローラーを持っており、ユーザーにはpasswordpassword_confirmation、およびpassword_digestフィールドがあります。私はbcryptルビーの宝石を使用しました。Rails-ユーザーのパスワードを保存できませんbcrypt

私はユーザーを作成するとき、私は上記のすべてのフィールドを与え、ユーザーは作成されます。しかし、ユーザーのpasswordは保存されません。password_digestフィールドに16進形式で保存されます。

私はユーザーの名前を編集するだけで、ユーザーフォームを編集するときはフォームに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 

HERESに私のユーザモデル:

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

しかし、Railsの4.xで、で検証されているpasswordを無効にするオプションがありますパスワードをデータベースに保存しないでください。セキュリティ上の理由からダイジェストとして保存されます。 – trueinViso

+0

実際のパスワードを保存することはなく、ダイジェストのみです。この方法は、データベースがハッキングされている場合、他のサービスのパスワードを推測するハッカーによってユーザーのパスワードを回復することはできません。 – Maxence

答えて

1

has_secure_passwordは、passwordpassword_digestを検証するように設計されています。

class User < ApplicationRecord 
    has_secure_password :validations => false 
end 

あなたのような、唯一のcreateに検証を実行することができるかもしれない:それはだ方法です

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

ありがとうShannon、私は2つのメソッドを検証したい場合、 "削除"と "作成"、 ":on"は2つのメソッドでは機能しません。 – suhasa

関連する問題