module Devise::Models

Public Instance Methods

devise(*modules) click to toggle source

Include the chosen devise modules in your model:

devise :database_authenticatable, :confirmable, :recoverable

You can also give any of the devise configuration values in form of a hash, with specific values for this model. Please check your Devise initializer for a complete description on those values.

# File lib/devise/models.rb, line 83
def devise(*modules)
  options = modules.extract_options!.dup

  selected_modules = modules.map(&:to_sym).uniq.sort_by do |s|
    Devise::ALL.index(s) || -1  # follow Devise::ALL order
  end

  devise_modules_hook! do
    include Devise::Models::Authenticatable
    selected_modules.each do |m|
      if m == :encryptable && !(defined?(Devise::Models::Encryptable))
        warn "[DEVISE] You're trying to include :encryptable in your model but it is not bundled with the Devise gem anymore. Please add `devise-encryptable` to your Gemfile to proceed.\n"
      end

      mod = Devise::Models.const_get(m.to_s.classify)

      if mod.const_defined?("ClassMethods")
        class_mod = mod.const_get("ClassMethods")
        extend class_mod

        if class_mod.respond_to?(:available_configs)
          available_configs = class_mod.available_configs
          available_configs.each do |config|
            next unless options.key?(config)
            send(:"#{config}=", options.delete(config))
          end
        end
      end

      include mod
    end

    self.devise_modules |= selected_modules
    options.each { |key, value| send(:"#{key}=", value) }
  end
end
devise_modules_hook!() { || ... } click to toggle source

The hook which is called inside devise. So your ORM can include devise compatibility stuff.

# File lib/devise/models.rb, line 122
def devise_modules_hook!
  yield
end

Public Class Methods

check_fields!(klass) click to toggle source
# File lib/devise/models.rb, line 52
def self.check_fields!(klass)
  failed_attributes = []
  instance = klass.new

  klass.devise_modules.each do |mod|
    constant = const_get(mod.to_s.classify)

    if constant.respond_to?(:required_fields)
      constant.required_fields(klass).each do |field|
        failed_attributes << field unless instance.respond_to?(field)
      end
    else
      ActiveSupport::Deprecation.warn "The module #{mod} doesn't implement self.required_fields(klass). "              "Devise uses required_fields to warn developers of any missing fields in their models. "              "Please implement #{mod}.required_fields(klass) that returns an array of symbols with the required fields."
    end
  end

  if failed_attributes.any?
    fail Devise::Models::MissingAttribute.new(failed_attributes)
  end
end