Class: ActionController::Routing::RouteSet::Mapper

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

Overview

:doc:

Instance Method Summary collapse

Instance Method Details

#devise_for(*resources) ⇒ Object

Includes devise_for method for routes. This method is responsible to generate all needed routes for devise, based on what modules you have defined in your model. Examples: Let’s say you have an User model configured to use authenticatable, confirmable and recoverable modules. After creating this inside your routes:

map.devise_for :users

this method is going to look inside your User model and create the needed routes:

# Session routes for Authenticatable (default)
     new_user_session GET  /users/sign_in                    {:controller=>"sessions", :action=>"new"}
         user_session POST /users/sign_in                    {:controller=>"sessions", :action=>"create"}
 destroy_user_session GET  /users/sign_out                   {:controller=>"sessions", :action=>"destroy"}

# Password routes for Recoverable, if User model has :recoverable configured
    new_user_password GET  /users/password/new(.:format)     {:controller=>"passwords", :action=>"new"}
   edit_user_password GET  /users/password/edit(.:format)    {:controller=>"passwords", :action=>"edit"}
        user_password PUT  /users/password(.:format)         {:controller=>"passwords", :action=>"update"}
                      POST /users/password(.:format)         {:controller=>"passwords", :action=>"create"}

# Confirmation routes for Confirmable, if User model has :confirmable configured
new_user_confirmation GET  /users/confirmation/new(.:format) {:controller=>"confirmations", :action=>"new"}
    user_confirmation GET  /users/confirmation(.:format)     {:controller=>"confirmations", :action=>"show"}
                      POST /users/confirmation(.:format)     {:controller=>"confirmations", :action=>"create"}

You can configure your routes with some options:

* :class_name => setup a different class to be looked up by devise, if it cannot be correctly find by the route name.

  map.devise_for :users, :class_name => 'Account'

* :as => allows you to setup path name that will be used, as rails routes does. The following route configuration would setup your route as /accounts instead of /users:

  map.devise_for :users, :as => 'accounts'

* :scope => setup the scope name. This is used as the instance variable name in controller, as the name in routes and the scope given to warden. Defaults to the singular of the given name:

  map.devise_for :users, :scope => :account

* :path_names => configure different path names to overwrite defaults :sign_in, :sign_out, :password and :confirmation.

  map.devise_for :users, :path_names => { :sign_in => 'login', :sign_out => 'logout', :password => 'secret', :confirmation => 'verification' }

* :path_prefix => the path prefix to be used in all routes.

  map.devise_for :users, :path_prefix => "/:locale"

Any other options will be passed to route definition. If you need conditions for your routes, just map:

  map.devise_for :users, :conditions => { :subdomain => /.+/ }

If you are using a dynamic prefix, like :locale above, you need to configure default_url_options through Devise. You can do that in config/initializers/devise.rb or setting a Devise.default_url_options:

  Devise.default_url_options do
    { :locale => I18n.locale }
  end


79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/devise/rails/routes.rb', line 79

def devise_for(*resources)
  options = resources.extract_options!

  resources.map!(&:to_sym)
  resources.each do |resource|
    mapping = Devise::Mapping.new(resource, options.dup)
    Devise.default_scope ||= mapping.name
    Devise.mappings[mapping.name] = mapping

    route_options = mapping.route_options.merge(:path_prefix => mapping.raw_path, :name_prefix => "#{mapping.name}_")

    with_options(route_options) do |routes|
      mapping.for.each do |mod|
        send(mod, routes, mapping) if self.respond_to?(mod, true)
      end
    end
  end
end