From e9057626111bcc185da0f1d8d8ca93c32fe5a996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sun, 16 May 2010 00:38:40 +0200 Subject: [PATCH] Clean up the whole loading mess and closes #247. This commit depends on latest Rails. --- lib/devise.rb | 15 ++++++++------- lib/devise/failure_app.rb | 1 + lib/devise/rails.rb | 32 ++++++++++++++++---------------- test/devise_test.rb | 1 + 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/lib/devise.rb b/lib/devise.rb index 6a9ee2ee..f919c8c1 100644 --- a/lib/devise.rb +++ b/lib/devise.rb @@ -230,16 +230,17 @@ module Devise # A method used internally to setup warden manager from the Rails initialize # block. def self.configure_warden! #:nodoc: - return unless warden_config + @@warden_configured ||= begin + warden_config.failure_app = Devise::FailureApp + warden_config.default_scope = Devise.default_scope - warden_config.failure_app = Devise::FailureApp - warden_config.default_scope = Devise.default_scope + Devise.mappings.each_value do |mapping| + warden_config.scope_defaults mapping.name, :strategies => mapping.strategies + end - Devise.mappings.each_value do |mapping| - warden_config.scope_defaults mapping.name, :strategies => mapping.strategies + @@warden_config_block.try :call, Devise.warden_config + true end - - @@warden_config_block.try :call, Devise.warden_config end # Generate a friendly string randomically to be used as token. diff --git a/lib/devise/failure_app.rb b/lib/devise/failure_app.rb index 0e3ec1a7..d26e5a30 100644 --- a/lib/devise/failure_app.rb +++ b/lib/devise/failure_app.rb @@ -9,6 +9,7 @@ module Devise include ActionController::RackDelegation include ActionController::UrlFor include ActionController::Redirecting + include Rails.application.routes.url_helpers delegate :flash, :to => :request diff --git a/lib/devise/rails.rb b/lib/devise/rails.rb index dcd5cd7f..244861a3 100644 --- a/lib/devise/rails.rb +++ b/lib/devise/rails.rb @@ -1,32 +1,32 @@ require 'devise/rails/routes' require 'devise/rails/warden_compat' +# Include UrlHelpers in ActionController and ActionView as soon as they are loaded. +ActiveSupport.on_load(:action_controller) { include Devise::Controllers::UrlHelpers } +ActiveSupport.on_load(:action_view) { include Devise::Controllers::UrlHelpers } + module Devise class Engine < ::Rails::Engine config.devise = Devise - initializer "devise.ensure_routes_are_loaded", :before => :load_app_classes, :after => :load_config_initializers do |app| - app.reload_routes! + config.app_middleware.use Warden::Manager do |config| + Devise.warden_config = config end - initializer "devise.add_middleware" do |app| - app.config.middleware.use Warden::Manager do |config| - Devise.warden_config = config - Devise.configure_warden! - end - end - - initializer "devise.add_url_helpers" do |app| - Devise::FailureApp.send :include, app.routes.url_helpers - ActionController::Base.send :include, Devise::Controllers::UrlHelpers - ActionView::Base.send :include, Devise::Controllers::UrlHelpers - end + # Force routes to be loaded if we are doing any eager load. + config.before_eager_load { |app| app.reload_routes! } config.after_initialize do - I18n.available_locales flash = [:unauthenticated, :unconfirmed, :invalid, :invalid_token, :timeout, :inactive, :locked] - I18n.backend.send(:translations).each do |locale, translations| + translations = begin + I18n.available_locales + I18n.backend.send(:translations) + rescue Exception => e # Do not care if something fails + {} + end + + translations.each do |locale, translations| keys = flash & (translations[:devise][:sessions].keys) rescue [] if keys.any? diff --git a/test/devise_test.rb b/test/devise_test.rb index 77a8c5b3..d21dbaee 100644 --- a/test/devise_test.rb +++ b/test/devise_test.rb @@ -2,6 +2,7 @@ require 'test_helper' module Devise def self.yield_and_restore + @@warden_configured = nil c, b = @@warden_config, @@warden_config_block yield ensure