I have a user table in my database and what I wish to do is have a random password generated for each user on create which is then sent to their email address. I was wondering how I would assign the random password.
I have the following in my view:
<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>
The following in my controller:
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
And I have the following in my user model:
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(length=8) chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ23456789' password = '' length.times { |i| password << chars[rand(chars.length)] } 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 will have to remove my if password.present? line because it won't be present but I have the random string code, I just need to assign it to the hash/salt.
I tried changing the following:
def encrypt_password if self.save self.password_salt = String.random_string self.password_hash = encrypt_password(@password) end end
But I get a stack too deep error.