Module: HasAToken::Concern::ClassMethods

Defined in:
lib/has_a_token/concern.rb

Overview

rubocop:disable all

Instance Method Summary collapse

Instance Method Details

#has_a_token(name = :token, opts = {}) ⇒ Object

Examples:

has_a_token :invite_code, charset: unambiguous # generates easily readable token
has_a_token :password_reset, length: 32  # generates a secure token of 32 length

before_create :generate_invite_code
before_save :generate_password_reset_token, if: "password_reset_token.nil?"

user = User.first
user.reset_password_reset_token!

Parameters:

  • name (Symbol) (defaults to: :token)

    name of the column

  • opts (Hash) (defaults to: {})

    generator options

Options Hash (opts):

  • :charset (Symbol)
  • :length (Symbol)

See Also:



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/has_a_token/concern.rb', line 29

def has_a_token(name = :token, opts = {}) # rubocop:disable all
  if String(name).match(/(_token|_code)$/)
    method_name = name.to_s
  else
    method_name = "#{name}_token"
  end

  define_method "generate_#{method_name}" do
    self[method_name] = loop do
      random_token = HasAToken::Generator.new(opts).generate
      break random_token unless self.class.exists?(Hash[method_name, random_token])
    end
  end

  define_method "reset_#{method_name}!" do
    send("generate_#{method_name}")
    save!
  end
end