diff --git a/app/controllers/confirmations_controller.rb b/app/controllers/confirmations_controller.rb
index 5c68e996..83ed9d1b 100644
--- a/app/controllers/confirmations_controller.rb
+++ b/app/controllers/confirmations_controller.rb
@@ -10,7 +10,7 @@ class ConfirmationsController < ApplicationController
# POST /confirmation
#
def create
- @confirmation = User.send_confirmation_instructions(params[:confirmation])
+ @confirmation = resource_class.send_confirmation_instructions(params[:confirmation])
if @confirmation.errors.empty?
flash[:notice] = I18n.t(:send_instructions, :scope => [:devise, :confirmations], :default => 'You will receive an email with instructions about how to confirm your account in a few minutes.')
redirect_to new_session_path
@@ -22,7 +22,7 @@ class ConfirmationsController < ApplicationController
# GET /confirmation?perishable_token=abcdef
#
def show
- @confirmation = User.confirm!(:perishable_token => params[:perishable_token])
+ @confirmation = resource_class.confirm!(:perishable_token => params[:perishable_token])
if @confirmation.errors.empty?
flash[:notice] = I18n.t(:confirm, :scope => [:devise, :confirmations], :default => 'Your account was successfully confirmed!')
redirect_to new_session_path
diff --git a/app/controllers/passwords_controller.rb b/app/controllers/passwords_controller.rb
index 3330a53e..85c016cd 100644
--- a/app/controllers/passwords_controller.rb
+++ b/app/controllers/passwords_controller.rb
@@ -10,7 +10,7 @@ class PasswordsController < ApplicationController
# POST /password
#
def create
- @password = User.send_reset_password_instructions(params[:password])
+ @password = resource_class.send_reset_password_instructions(params[:password])
if @password.errors.empty?
flash[:notice] = I18n.t(:send_instructions, :scope => [:devise, :passwords], :default => 'You will receive an email with instructions about how to reset your password in a few minutes.')
redirect_to new_session_path
@@ -22,14 +22,14 @@ class PasswordsController < ApplicationController
# GET /password/edit?perishable_token=abcdef
#
def edit
- @password = User.new
+ @password = resource_class.new
@password.perishable_token = params[:perishable_token]
end
# PUT /password
#
def update
- @password = User.reset_password!(params[:password])
+ @password = resource_class.reset_password!(params[:password])
if @password.errors.empty?
flash[:notice] = I18n.t(:update, :scope => [:devise, :passwords], :default => 'Your password was changed successfully.')
redirect_to new_session_path
diff --git a/lib/devise.rb b/lib/devise.rb
index fc2c515a..e728407b 100644
--- a/lib/devise.rb
+++ b/lib/devise.rb
@@ -17,19 +17,22 @@ require 'devise/initializers/warden'
module Devise
mattr_accessor :mappings
- self.mappings = {}
+ self.mappings = {}.with_indifferent_access
def self.map(mapping, options={})
raise ArgumentError, "Need to provide :for option for Devise.map" unless options.key?(:for)
options.assert_valid_keys(:to, :for, :as)
- options[:as] ||= mapping
- options[:to] ||= mapping.to_s.singularize.camelize.constantize
- mappings[mapping.to_sym] = options
- mappings.default = mapping.to_sym if mappings.default.nil?
+ mapping = mapping.to_s
+ options[:as] ||= mapping.pluralize
+ mapping = mapping.singularize
+ options[:to] ||= mapping.camelize.constantize
+ mapping = mapping.to_sym
+ mappings[mapping] = options
+ mappings.default = mapping if mappings.default.nil?
end
def self.find_mapping(map)
- if map.present? && mappings.key?(map.to_sym)
+ if mappings.key?(map.try(:to_sym))
map
elsif mapping = mappings.detect{|m, options| options[:as] == map}.try(:first)
mapping
@@ -37,10 +40,16 @@ module Devise
mappings.default
end.to_s
end
+
+ def self.resource_name(map)
+ find_mapping(map)
+ end
+
+ def self.resource_class(map)
+ mappings[resource_name(map).to_sym].try(:fetch, :to, nil)
+ end
end
-ActionView::Base.send :include, DeviseHelper
-ActionView::Base.send :include, Devise::Controllers::UrlHelpers
-ActionController::Base.send :include, Devise::Controllers::Authenticable
-ActionController::Base.send :include, Devise::Controllers::UrlHelpers
ActiveRecord::Base.send :extend, Devise::ActiveRecord
+ActionController::Base.send :include, Devise::ActionController
+ActionView::Base.send :include, Devise::ActionView
diff --git a/lib/devise/action_controller.rb b/lib/devise/action_controller.rb
new file mode 100644
index 00000000..8bd36cc2
--- /dev/null
+++ b/lib/devise/action_controller.rb
@@ -0,0 +1,12 @@
+module Devise
+ module ActionController
+
+ def self.included(base)
+ base.class_eval do
+ include Devise::Controllers::Authenticable
+ include Devise::Controllers::Resources
+ include Devise::Controllers::UrlHelpers
+ end
+ end
+ end
+end
diff --git a/lib/devise/action_view.rb b/lib/devise/action_view.rb
new file mode 100644
index 00000000..c07c1ee4
--- /dev/null
+++ b/lib/devise/action_view.rb
@@ -0,0 +1,12 @@
+module Devise
+ module ActionView
+
+ def self.included(base)
+ base.class_eval do
+ include DeviseHelper
+ include Devise::Controllers::Resources
+ include Devise::Controllers::UrlHelpers
+ end
+ end
+ end
+end
diff --git a/lib/devise/controllers/authenticable.rb b/lib/devise/controllers/authenticable.rb
index 5e4b845c..067585b0 100644
--- a/lib/devise/controllers/authenticable.rb
+++ b/lib/devise/controllers/authenticable.rb
@@ -2,17 +2,16 @@ module Devise
module Controllers
module Authenticable
- def self.included(base)
- base.class_eval do
-
+# def self.included(base)
+# base.class_eval do
# helper_method :session_path, :session_url,
# :new_session_path, :new_session_url,
# :password_path, :password_url,
# :new_password_path, :new_password_url,
# :confirmation_path, :confirmation_url,
# :new_confirmation_path, :new_confirmation_url
- end
- end
+# end
+# end
protected
diff --git a/lib/devise/controllers/resources.rb b/lib/devise/controllers/resources.rb
new file mode 100644
index 00000000..94e3d507
--- /dev/null
+++ b/lib/devise/controllers/resources.rb
@@ -0,0 +1,20 @@
+module Devise
+ module Controllers
+ module Resources
+
+ def resource_name(object=nil)
+ @resource_name ||= Devise.resource_name(resource_name_or_request_path(object))
+ end
+
+ def resource_class
+ @resource_class ||= Devise.resource_class(resource_name_or_request_path)
+ end
+
+ private
+
+ def resource_name_or_request_path(object=nil)
+ object ? object.class.name : request.path.split('/').second
+ end
+ end
+ end
+end
diff --git a/lib/devise/controllers/url_helpers.rb b/lib/devise/controllers/url_helpers.rb
index 448cb5f8..3b4643e8 100644
--- a/lib/devise/controllers/url_helpers.rb
+++ b/lib/devise/controllers/url_helpers.rb
@@ -2,13 +2,17 @@ module Devise
module Controllers
module UrlHelpers
- def resource_name(resource=nil)
- @resource_name ||= Devise.find_mapping(resource ? resource.class.name : request.path.split('/').second)
- end
-
- def resource_class
- @resource_class ||= resource_name.singularize.camelize.constantize
- end
+# def self.included(base)
+# base.class_eval do
+# helper_method :session_path, :session_url,
+# :new_session_path, :new_session_url,
+# :password_path, :password_url,
+# :new_password_path, :new_password_url,
+# :edit_password_path, :edit_password_url,
+# :confirmation_path, :confirmation_url,
+# :new_confirmation_path, :new_confirmation_url
+# end
+# end
# TODO: refactor url helpers generation
[:session, :password, :confirmation].each do |module_name|
diff --git a/test/controllers/resources_test.rb b/test/controllers/resources_test.rb
index 74aad6b5..30f40543 100644
--- a/test/controllers/resources_test.rb
+++ b/test/controllers/resources_test.rb
@@ -5,7 +5,7 @@ class ResourcesTest < ActionController::TestCase
test 'should get resource name from request path' do
@request.path = '/users/session'
- assert_equal 'users', @controller.resource_name
+ assert_equal 'user', @controller.resource_name
end
test 'should get translated resource name from request path' do
diff --git a/test/controllers/url_helpers_test.rb b/test/controllers/url_helpers_test.rb
index e5838fde..623557bb 100644
--- a/test/controllers/url_helpers_test.rb
+++ b/test/controllers/url_helpers_test.rb
@@ -7,20 +7,20 @@ class RoutesTest < ActionController::TestCase
@request.path = '/users/session'
prepend_path = "#{prepend_path}_" if prepend_path
assert_equal @controller.send(:"#{prepend_path}#{name}_path"),
- send(:"#{prepend_path}users_#{name}_path")
+ send(:"#{prepend_path}user_#{name}_path")
assert_equal @controller.send(:"#{prepend_path}#{name}_url"),
- send(:"#{prepend_path}users_#{name}_url")
+ send(:"#{prepend_path}user_#{name}_url")
assert_equal @controller.send(:"#{prepend_path}#{name}_path", :param => 123),
- send(:"#{prepend_path}users_#{name}_path", :param => 123)
+ send(:"#{prepend_path}user_#{name}_path", :param => 123)
assert_equal @controller.send(:"#{prepend_path}#{name}_url", :param => 123),
- send(:"#{prepend_path}users_#{name}_url", :param => 123)
+ send(:"#{prepend_path}user_#{name}_url", :param => 123)
-# @request.path = nil
-# assert_equal @controller.send(:"#{prepend_path}#{name}_path", User.new),
-# send(:"#{prepend_path}users_#{name}_path")
-# assert_equal @controller.send(:"#{prepend_path}#{name}_url", User.new),
-# send(:"#{prepend_path}users_#{name}_url")
+ @request.path = nil
+ assert_equal @controller.send(:"#{prepend_path}#{name}_path", User.new),
+ send(:"#{prepend_path}user_#{name}_path")
+ assert_equal @controller.send(:"#{prepend_path}#{name}_url", User.new),
+ send(:"#{prepend_path}user_#{name}_url")
end
diff --git a/test/helpers/devise_helper_test.rb b/test/helpers/devise_helper_test.rb
index 015710fa..1d28f9cc 100644
--- a/test/helpers/devise_helper_test.rb
+++ b/test/helpers/devise_helper_test.rb
@@ -13,35 +13,35 @@ class DeviseHelperTest < ActionView::TestCase
end
test 'should generate a link to sign in' do
- self.stubs(:new_session_path).returns(new_users_session_path)
- assert_equal %[Sign in], link_to_sign_in
+ self.stubs(:new_session_path).returns(new_user_session_path)
+ assert_equal %[Sign in], link_to_sign_in
end
test 'should use i18n to translante sign in link' do
- self.stubs(:new_session_path).returns(new_users_session_path)
+ self.stubs(:new_session_path).returns(new_user_session_path)
store_translations(:sign_in => 'Login')
- assert_equal %[Login], link_to_sign_in
+ assert_equal %[Login], link_to_sign_in
end
test 'should generate a link to forgot password' do
- self.stubs(:new_password_path).returns(new_users_password_path)
- assert_equal %[Forgot password?], link_to_new_password
+ self.stubs(:new_password_path).returns(new_user_password_path)
+ assert_equal %[Forgot password?], link_to_new_password
end
test 'should use i18n to translante forgot password link' do
- self.stubs(:new_password_path).returns(new_users_password_path)
+ self.stubs(:new_password_path).returns(new_user_password_path)
store_translations(:new_password => 'New password?')
- assert_equal %[New password?], link_to_new_password
+ assert_equal %[New password?], link_to_new_password
end
test 'should generate a link to confirmation instructions' do
- self.stubs(:new_confirmation_path).returns(new_users_confirmation_path)
- assert_equal %[Didn't receive confirmation instructions?], link_to_new_confirmation
+ self.stubs(:new_confirmation_path).returns(new_user_confirmation_path)
+ assert_equal %[Didn't receive confirmation instructions?], link_to_new_confirmation
end
test 'should use i18n to translante confirmation link' do
- self.stubs(:new_confirmation_path).returns(new_users_confirmation_path)
+ self.stubs(:new_confirmation_path).returns(new_user_confirmation_path)
store_translations(:new_confirmation => 'New confirmation?')
- assert_equal %[New confirmation?], link_to_new_confirmation
+ assert_equal %[New confirmation?], link_to_new_confirmation
end
end
diff --git a/test/integration/authentication_test.rb b/test/integration/authentication_test.rb
index 66a15b5f..0b64ec70 100644
--- a/test/integration/authentication_test.rb
+++ b/test/integration/authentication_test.rb
@@ -60,7 +60,7 @@ class AuthenticationTest < ActionController::IntegrationTest
delete 'users/session'
assert_response :redirect
- assert_redirected_to new_users_session_path
+ assert_redirected_to new_user_session_path
assert !warden.authenticated?
end
end
diff --git a/test/integration/confirmation_test.rb b/test/integration/confirmation_test.rb
index 0bf25dbb..d81d9b2b 100644
--- a/test/integration/confirmation_test.rb
+++ b/test/integration/confirmation_test.rb
@@ -5,7 +5,7 @@ class ConfirmationsTest < ActionController::IntegrationTest
test 'authenticated user should not be able to visit confirmation page' do
sign_in
- get new_users_confirmation_path
+ get new_user_confirmation_path
assert_response :redirect
assert_redirected_to root_path
@@ -28,7 +28,7 @@ class ConfirmationsTest < ActionController::IntegrationTest
end
test 'not authenticated user with invalid perishable token should not be able to confirm an account' do
- visit users_confirmation_path(:perishable_token => 'invalid_perishable')
+ visit user_confirmation_path(:perishable_token => 'invalid_perishable')
assert_response :success
assert_template 'confirmations/new'
@@ -40,7 +40,7 @@ class ConfirmationsTest < ActionController::IntegrationTest
user = create_user(:confirm => false)
assert_not user.confirmed?
- visit users_confirmation_path(:perishable_token => user.perishable_token)
+ visit user_confirmation_path(:perishable_token => user.perishable_token)
# assert_response :redirect
assert_template 'sessions/new'
@@ -51,7 +51,7 @@ class ConfirmationsTest < ActionController::IntegrationTest
test 'already confirmed user should not be able to confirm the account again' do
user = create_user
- visit users_confirmation_path(:perishable_token => user.perishable_token)
+ visit user_confirmation_path(:perishable_token => user.perishable_token)
assert_template 'confirmations/new'
assert_have_selector '#errorExplanation'
diff --git a/test/integration/password_recovery_test.rb b/test/integration/password_recovery_test.rb
index 34fccb7f..2b858d4b 100644
--- a/test/integration/password_recovery_test.rb
+++ b/test/integration/password_recovery_test.rb
@@ -18,7 +18,7 @@ class PasswordRecoveryTest < ActionController::IntegrationTest
test 'authenticated user should not be able to visit forgot password page' do
sign_in
- get new_users_password_path
+ get new_user_password_path
assert_response :redirect
assert_redirected_to root_path
@@ -58,7 +58,7 @@ class PasswordRecoveryTest < ActionController::IntegrationTest
test 'authenticated user should not be able to visit edit password page' do
sign_in
- get edit_users_password_path
+ get edit_user_password_path
assert_response :redirect
assert_redirected_to root_path
@@ -67,7 +67,7 @@ class PasswordRecoveryTest < ActionController::IntegrationTest
test 'not authenticated with invalid perishable token should not be able to change his password' do
create_user
- visit edit_users_password_path(:perishable_token => 'invalid_perishable')
+ visit edit_user_password_path(:perishable_token => 'invalid_perishable')
assert_response :success
assert_template 'passwords/edit'
@@ -84,7 +84,7 @@ class PasswordRecoveryTest < ActionController::IntegrationTest
test 'not authenticated with valid perisable token but invalid password should not be able to change his password' do
create_user
- visit edit_users_password_path(:perishable_token => @user.perishable_token)
+ visit edit_user_password_path(:perishable_token => @user.perishable_token)
fill_in 'Password', :with => '987654321'
fill_in 'Password confirmation', :with => 'other_password'
@@ -99,7 +99,7 @@ class PasswordRecoveryTest < ActionController::IntegrationTest
test 'not authenticated with valid data should be able to change his password' do
create_user
- visit edit_users_password_path(:perishable_token => @user.perishable_token)
+ visit edit_user_password_path(:perishable_token => @user.perishable_token)
fill_in 'Password', :with => '987654321'
fill_in 'Password confirmation', :with => '987654321'
diff --git a/test/map_test.rb b/test/map_test.rb
index a4d712f5..458050f8 100644
--- a/test/map_test.rb
+++ b/test/map_test.rb
@@ -1,6 +1,7 @@
require 'test/test_helper'
class Participant < User; end
+class Organizer < User; end
class MapTest < ActiveSupport::TestCase
@@ -17,7 +18,7 @@ class MapTest < ActiveSupport::TestCase
Devise.map :participants, :to => Participant, :for => [:authenticable]
mappings = Devise.mappings
assert_not mappings.empty?
- assert_equal({:to => Participant, :for => [:authenticable], :as => :participants}, mappings[:participants])
+ assert_equal({:to => Participant, :for => [:authenticable], :as => 'participants'}, mappings[:participant])
end
test 'require :for option' do
@@ -36,32 +37,51 @@ class MapTest < ActiveSupport::TestCase
Devise.mappings.default = nil
assert_nil Devise.mappings.default
Devise.map :participants, :for => [:authenticable]
- assert_equal :participants, Devise.mappings.default
+ assert_equal :participant, Devise.mappings.default
+ Devise.map :organizers, :for => [:authenticable]
+ assert_equal :participant, Devise.mappings.default
+ end
+
+ test 'singularize map' do
+ Devise.map :participants, :for => [:authenticable]
+ assert_not_nil Devise.mappings[:participant]
+ end
+
+ test 'use map name pluralized to :as option if none is given' do
+ Devise.map :participants, :for => [:authenticable]
+ assert_equal 'participants', Devise.mappings[:participant][:as]
end
test 'map should lookup for the mapping class if no one is given' do
Devise.map :participants, :for => [:authenticable]
- assert_equal Participant, Devise.mappings[:participants][:to]
- end
-
- test 'use mapping to :as option if none is given' do
- Devise.map :participants, :for => [:authenticable]
- assert_equal :participants, Devise.mappings[:participants][:as]
+ assert_equal Participant, Devise.mappings[:participant][:to]
end
test 'find right mapping to use for routing' do
Devise.map :participants, :for => [:authenticable]
- assert_equal 'participants', Devise.find_mapping('participants')
+ assert_equal 'participant', Devise.find_mapping('participants')
end
test 'find right mapping to Participant for routing with :as option' do
Devise.map :participants, :for => [:authenticable], :as => 'usuarios'
- assert_equal 'participants', Devise.find_mapping('usuarios')
+ assert_equal 'participant', Devise.find_mapping('usuarios')
end
test 'find mapping should return default map in no one is found or empty is given' do
Devise.map :participants, :for => [:authenticable]
- assert_equal 'participants', Devise.find_mapping('test_drive')
- assert_equal 'participants', Devise.find_mapping(nil)
+ assert_equal 'participant', Devise.find_mapping('test_drive')
+ assert_equal 'participant', Devise.find_mapping(nil)
+ end
+
+ test 'find resource name based on mapping' do
+ Devise.map :participants, :for => [:authenticable]
+ assert_equal 'participant', Devise.resource_name('participants')
+ end
+
+ test 'find resource class based on mapping' do
+ Devise.map :participants, :for => [:authenticable]
+ assert_equal Participant, Devise.resource_class('participants')
+ Devise.map :organizers, :for => [:authenticable]
+ assert_equal Organizer, Devise.resource_class('organizers')
end
end
diff --git a/test/routes/confirmation_routing_test.rb b/test/routes/confirmation_routing_test.rb
index b21fd465..d26bcee3 100644
--- a/test/routes/confirmation_routing_test.rb
+++ b/test/routes/confirmation_routing_test.rb
@@ -3,20 +3,20 @@ require 'test_helper'
class ConfirmationRoutingTest < ActionController::TestCase
test 'new session route' do
- assert_routing('users/confirmation/new', :controller => 'confirmations', :action => 'new')
+ assert_recognizes({:controller => 'confirmations', :action => 'new'}, 'users/confirmation/new')
end
test 'create confirmation route' do
- assert_routing({:path => 'users/confirmation', :method => :post}, {:controller => 'confirmations', :action => 'create'})
+ assert_recognizes({:controller => 'confirmations', :action => 'create'}, {:path => 'users/confirmation', :method => :post})
end
test 'show confirmation route' do
- assert_routing('users/confirmation', :controller => 'confirmations', :action => 'show')
+ assert_recognizes({:controller => 'confirmations', :action => 'show'}, 'users/confirmation')
end
test 'translated confirmation route' do
translated_route(:confirmation => 'confirmacao') do
- assert_routing('users/confirmacao/new', :controller => 'confirmations', :action => 'new')
+ assert_recognizes({:controller => 'confirmations', :action => 'new'}, 'users/confirmacao/new')
end
end
end
diff --git a/test/routes/password_routing_test.rb b/test/routes/password_routing_test.rb
index a67bec4c..9a6dce85 100644
--- a/test/routes/password_routing_test.rb
+++ b/test/routes/password_routing_test.rb
@@ -3,24 +3,24 @@ require 'test_helper'
class PasswordRoutingTest < ActionController::TestCase
test 'new password route' do
- assert_routing('users/password/new', :controller => 'passwords', :action => 'new')
+ assert_recognizes({:controller => 'passwords', :action => 'new'}, 'users/password/new')
end
test 'create password route' do
- assert_routing({:path => 'users/password', :method => :post}, {:controller => 'passwords', :action => 'create'})
+ assert_recognizes({:controller => 'passwords', :action => 'create'}, {:path => 'users/password', :method => :post})
end
test 'edit password route' do
- assert_routing('users/password/edit', :controller => 'passwords', :action => 'edit')
+ assert_recognizes({:controller => 'passwords', :action => 'edit'}, 'users/password/edit')
end
test 'update password route' do
- assert_routing({:path => 'users/password', :method => :put}, {:controller => 'passwords', :action => 'update'})
+ assert_recognizes({:controller => 'passwords', :action => 'update'}, {:path => 'users/password', :method => :put})
end
test 'translated password route' do
translated_route(:password => 'senha') do
- assert_routing('users/senha/new', :controller => 'passwords', :action => 'new')
+ assert_recognizes({:controller => 'passwords', :action => 'new'}, 'users/senha/new')
end
end
end
diff --git a/test/routes/session_routing_test.rb b/test/routes/session_routing_test.rb
index 0373c561..527b867b 100644
--- a/test/routes/session_routing_test.rb
+++ b/test/routes/session_routing_test.rb
@@ -3,20 +3,20 @@ require 'test_helper'
class SessionRoutingTest < ActionController::TestCase
test 'new session route' do
- assert_routing('users/session/new', :controller => 'sessions', :action => 'new')
+ assert_recognizes({:controller => 'sessions', :action => 'new'}, 'users/session/new')
end
test 'create session route' do
- assert_routing({:path => 'users/session', :method => :post}, {:controller => 'sessions', :action => 'create'})
+ assert_recognizes({:controller => 'sessions', :action => 'create'}, {:path => 'users/session', :method => :post})
end
test 'destroy session route' do
- assert_routing({:path => 'users/session', :method => :delete}, {:controller => 'sessions', :action => 'destroy'})
+ assert_recognizes({:controller => 'sessions', :action => 'destroy'}, {:path => 'users/session', :method => :delete})
end
test 'translate session route' do
translated_route(:session => 'sessao') do
- assert_routing('users/sessao/new', :controller => 'sessions', :action => 'new')
+ assert_recognizes({:controller => 'sessions', :action => 'new'}, 'users/sessao/new')
end
end
end