2012-03-14 4 views
1

私のデータベースにユーザーテーブルがあります。作成する際に各ユーザーごとに ランダムパスワードが生成され、 電子メールアドレスに送信されます。私はどのようにランダムな パスワードを割り当てるのだろうと思っていた。作成時にランダムパスワードを割り当てます

<p> 
    <div id="p1"><%= t('.username')%></div> 
    <%= f.text_field :username %> 
</p> 
<p> 
    <div id="p1"><%= t('.email')%></div> 
    <%= f.text_field :email %> 
</p> 
<p class="button"><%= f.submit 'Create Account' %></p> 

は私のコントローラで次のよう:

def create 
@user = User.new(params[:user]) 
respond_to do |format| 
    if @user.save 
    Notifier.user_created(@user).deliver 
     format.html { redirect_to @user, notice: 'User was successfully created.' } 
     format.json { render json: @user, status: :created, location: @user } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @user.errors, status::unprocessable_entity } 
    end 
    end 
end 

そして、私は私のユーザーモデルでは、次のしている:

attr_accessor :password 
before_save :encrypt_password 

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 

def self.random_string(len) 
    #generate a random password consisting of strings and digits 
    chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a password = "" 
    1.upto(len) { |i| password << chars[rand(chars.size-1)]} 
    return password 
end 

def self.authenticate(email, password) 
    user = find_by_email(email) 
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt) 
    user 
else 
    nil 
end 
end 

I

私は、私の見解では、以下の持っています私はpassword.presentを削除する必要がありますか?私はランダムな文字列コードを持っているので、ハッシュ/ソルトに割り当てる必要があります。

答えて

2
def create 
@user = User.new(params[:user]) 
@user.password = User.random_string(10) #set it with the size of the password you want 
respond_to do |format| 
    if @user.save 
    Notifier.user_created(@user).deliver 
     format.html { redirect_to @user, notice: 'User was successfully created.' } 
     format.json { render json: @user, status: :created, location: @user } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @user.errors, status::unprocessable_entity } 
    end 
    end 
end 
'をbefore_create' を使用することができます

楽しいです!

1

私が思う、あなたは自分のencrypt_passwordを変更することができ;)

before_save :encrypt_password 

def encrypt_password 
    self.password = User.random_string(X) unless password.present? 
    self.password_salt = BCrypt::Engine.generate_salt 
    self.password_hash = BCrypt::Engine.hash_secret(password, password_salt) 
end 

EDIT:あなたが作成するだけでパスワードを暗号化したい場合は、あなたの代わりに 'before_save' の

関連する問題