module ActiveModel::SecureAttribute::ClassMethods

Public Instance Methods

has_secure(attr, opts={}) click to toggle source
# File lib/active_model/secure_attribute/has_secure_attribute.rb, line 21
def has_secure(attr, opts={})
  has_secure_attribute(attr, opts)
end
method_missing(meth, *args, &block) click to toggle source
Calls superclass method
# File lib/active_model/secure_attribute/has_secure_attribute.rb, line 13
def method_missing(meth, *args, &block)
  if meth.to_s =~ /^has_secure_(.+)$/
    has_secure_attribute($1, *args, &block)
  else
    super
  end
end

Protected Instance Methods

confirm(attribute_sym) click to toggle source
# File lib/active_model/secure_attribute/has_secure_attribute.rb, line 42
def confirm(attribute_sym)
  validates attribute_sym,                          confirmation: true, if: lambda { |m| m.send(attribute_sym).present? }
  validates "#{attribute_sym}_confirmation".to_sym, presence: true,     if: lambda { |m| m.send(attribute_sym).present? }
end
define_authenticate_method(attribute_sym, options) click to toggle source
# File lib/active_model/secure_attribute/has_secure_attribute.rb, line 64
def define_authenticate_method(attribute_sym, options)
  define_method "authenticate_#{attribute_sym}" do |value|
    BCrypt::Password.new(send("#{attribute_sym}_digest")) == (options[:case_sensitive] ? value : value.downcase) && self
  end
end
define_setter(attribute_sym, options) click to toggle source
# File lib/active_model/secure_attribute/has_secure_attribute.rb, line 47
def define_setter(attribute_sym, options)
  define_method "#{attribute_sym.to_s}=" do |unencrypted_value|
    unless unencrypted_value.blank?
      instance_variable_set("@#{attribute_sym.to_s}".to_sym, unencrypted_value)
      cost = ActiveModel::SecureAttribute.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine::DEFAULT_COST
      send("#{attribute_sym.to_s}_digest=".to_sym, BCrypt::Password.create(options[:case_sensitive] ? unencrypted_value : unencrypted_value.downcase, cost: cost))
    end
  end
end
has_secure_attribute(meth, *args, &block) click to toggle source
# File lib/active_model/secure_attribute/has_secure_attribute.rb, line 25
def has_secure_attribute(meth, *args, &block)
  attribute_sym = meth.to_sym
  attr_reader attribute_sym # setter is defined later on
  options = {validations: true, protect_setter_for_digest: false, case_sensitive: true, confirmation: true}
  options.merge! args[0] unless args.blank?
  if options[:validations]
    confirm attribute_sym if options[:confirmation]
    validates attribute_sym, presence: true,     on: :create
    before_create { raise "#{attribute_sym}_digest missing on new record" if send("#{attribute_sym}_digest").blank? }
  end

  define_setter(attribute_sym, options)
  protect_setter_for_digest(attribute_sym) if options[:protect_setter_for_digest]

  define_authenticate_method(attribute_sym, options)
end
protect_setter_for_digest(attribute_sym) click to toggle source
# File lib/active_model/secure_attribute/has_secure_attribute.rb, line 57
def protect_setter_for_digest(attribute_sym)
  define_method "#{attribute_sym}_digest=" do |value|
    write_attribute "#{attribute_sym}_digest".to_sym, value
  end
  protected "#{attribute_sym}_digest=".to_sym
end