Class: Devise::Mapping

Inherits:
Object
  • Object
show all
Defined in:
lib/devise/mapping.rb

Overview

Responsible for handling devise mappings and routes configuration. Each resource configured by devise_for in routes is actually creating a mapping object. You can refer to devise_for in routes for usage options.

The required value in devise_for is actually not used internally, but it’s inflected to find all other values.

map.devise_for :users
mapping = Devise.mappings[:user]

mapping.name #=> :user
# is the scope used in controllers and warden, given in the route as :singular.

mapping.as   #=> "users"
# how the mapping should be search in the path, given in the route as :as.

mapping.to   #=> User
# is the class to be loaded from routes, given in the route as :class_name.

mapping.for  #=> [:authenticatable]
# is the modules included in the class

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, options) ⇒ Mapping

:nodoc:



57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/devise/mapping.rb', line 57

def initialize(name, options) #:nodoc:
  @as    = (options.delete(:as) || name).to_sym
  @klass = (options.delete(:class_name) || name.to_s.classify).to_s
  @name  = (options.delete(:scope) || name.to_s.singularize).to_sym

  @path_prefix   = "/#{options.delete(:path_prefix)}/".squeeze("/")
  @route_options = options || {}

  @path_names = Hash.new { |h,k| h[k] = k.to_s }
  @path_names.merge!(options.delete(:path_names) || {})

  @sign_out_via = (options.delete(:sign_out_via) || :get)
end

Instance Attribute Details

#asObject (readonly)

:nodoc:



25
26
27
# File 'lib/devise/mapping.rb', line 25

def as
  @as
end

#nameObject (readonly)

:nodoc:



25
26
27
# File 'lib/devise/mapping.rb', line 25

def name
  @name
end

#path_namesObject (readonly)

:nodoc:



25
26
27
# File 'lib/devise/mapping.rb', line 25

def path_names
  @path_names
end

#path_prefixObject (readonly)

:nodoc:



25
26
27
# File 'lib/devise/mapping.rb', line 25

def path_prefix
  @path_prefix
end

#route_optionsObject (readonly)

:nodoc:



25
26
27
# File 'lib/devise/mapping.rb', line 25

def route_options
  @route_options
end

#sign_out_viaObject (readonly)

:nodoc:



25
26
27
# File 'lib/devise/mapping.rb', line 25

def sign_out_via
  @sign_out_via
end

Class Method Details

.default_url_optionsObject

Default url options which can be used as prefix.



53
54
55
# File 'lib/devise/mapping.rb', line 53

def self.default_url_options
  {}
end

.find_by_path(path) ⇒ Object

Loop through all mappings looking for a map that matches with the requested path (ie /users/sign_in). If a path prefix is given, it’s taken into account.



29
30
31
32
33
34
35
# File 'lib/devise/mapping.rb', line 29

def self.find_by_path(path)
  Devise.mappings.each_value do |mapping|
    route = path.split("/")[mapping.as_position]
    return mapping if route && mapping.as == route.to_sym
  end
  nil
end

.find_scope!(duck) ⇒ Object

Receives an object and find a scope for it. If a scope cannot be found, raises an error. If a symbol is given, it’s considered to be the scope.



39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/devise/mapping.rb', line 39

def self.find_scope!(duck)
  case duck
  when String, Symbol
    return duck
  when Class
    Devise.mappings.each_value { |m| return m.name if duck <= m.to }
  else
    Devise.mappings.each_value { |m| return m.name if duck.is_a?(m.to) }
  end

  raise "Could not find a valid mapping for #{duck}"
end

.register(*modules) ⇒ Object

Create magic predicates for verifying what module is activated by this map. Example:

def confirmable?
  self.for.include?(:confirmable)
end


119
120
121
122
123
124
125
126
127
# File 'lib/devise/mapping.rb', line 119

def self.register(*modules)
  modules.each do |m|
    class_eval <<-METHOD, __FILE__, __LINE__ + 1
      def #{m}?
        self.for.include?(:#{m})
      end
    METHOD
  end
end

Instance Method Details

#allows?(controller) ⇒ Boolean

Check if the respective controller has a module in the mapping class.

Returns:

  • (Boolean)


85
86
87
# File 'lib/devise/mapping.rb', line 85

def allows?(controller)
  (self.for & CONTROLLERS[controller.to_sym]).present?
end

#as_positionObject

Return in which position in the path prefix devise should find the as mapping.



90
91
92
# File 'lib/devise/mapping.rb', line 90

def as_position
  self.path_prefix.count("/")
end

#authenticatable?Boolean

Returns:

  • (Boolean)


108
109
110
# File 'lib/devise/mapping.rb', line 108

def authenticatable?
  @authenticatable ||= self.for.any? { |m| m.to_s =~ /authenticatable/ }
end

#forObject

Return modules for the mapping.



72
73
74
# File 'lib/devise/mapping.rb', line 72

def for
  @for ||= to.devise_modules
end

#parsed_pathObject

Returns the parsed path taking into account the relative url root and raw path.



100
101
102
103
104
105
106
# File 'lib/devise/mapping.rb', line 100

def parsed_path
  (ActionController::Base.relative_url_root.to_s + raw_path).tap do |path|
    self.class.default_url_options.each do |key, value|
      path.gsub!(key.inspect, value.to_param)
    end
  end
end

#raw_pathObject

Returns the raw path using path_prefix and as.



95
96
97
# File 'lib/devise/mapping.rb', line 95

def raw_path
  path_prefix + as.to_s
end

#toObject

Reload mapped class each time when cache_classes is false.



77
78
79
80
81
82
# File 'lib/devise/mapping.rb', line 77

def to
  return @to if @to
  klass = @klass.constantize
  @to = klass if Rails.configuration.cache_classes
  klass
end