How to auto-generate passwords in Rails Devise?

Use the Devise.friendly_token method:

password_length = 6
password = Devise.friendly_token.first(password_length)
User.create!(:email => '[email protected]', :password => password, :password_confirmation => password)

FYI: Devise.friendly_token returns a 20 character token. In the example above, we're chopping off the first password_length characters of the generated token by using the String#first method that Rails provides.


I'm using devise-security gem and have specefic password_complexity requirements as follows:

config.password_complexity = { digit: 1, lower: 1, upper: 1 }

If you use this code: Devise.friendly_token.first(password_length) to generate the password, you are not always guaranteed to get a password that matches your complexity.

So I wrote a password generator that will respect your password_complexity and will generate a random complaint password:

class PasswordGenerator
  include ActiveModel::Validations
  validates :password, 'devise_security/password_complexity': Devise.password_complexity
  attr_reader :password

  def initialize
    @password = Devise.friendly_token.first(Devise.password_length.first) until valid?
  end
end

You can use it as follows:

PasswordGenerator.new.password # "qHc165ku"


One option would be to use the Devise.generate_token. I.e.

password = User.generate_token('password')
User.create!(:email => '[email protected]', :password => password, :password_confirmation => password)

This option has not been available in Devise for quite a while. Please refer to the other answer (friendly_token).