From a949f9eca24f9d43f516363fbf2f5d004623355e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Tue, 3 Jan 2012 20:32:51 +0100 Subject: [PATCH] FailureApp shuold always consider Devise.router_name, closes #1544 --- lib/devise/controllers/url_helpers.rb | 10 +++++++++- lib/devise/failure_app.rb | 8 ++++++-- lib/devise/rails.rb | 9 +++++++++ test/failure_app_test.rb | 14 +++++++++----- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/devise/controllers/url_helpers.rb b/lib/devise/controllers/url_helpers.rb index e4788d5e..1496c0c9 100644 --- a/lib/devise/controllers/url_helpers.rb +++ b/lib/devise/controllers/url_helpers.rb @@ -16,7 +16,15 @@ module Devise # new_confirmation_path(:user) => new_user_confirmation_path # confirmation_path(:user) => user_confirmation_path # - # Those helpers are added to your ApplicationController. + # Those helpers are included by default to ActionController::Base. + # + # In case you want to add such helpers to another class, you can do + # that as long as this new class includes both url_helpers and + # mounted_helpers. Example: + # + # include Rails.application.routes.url_helpers + # include Rails.application.routes.mounted_helpers + # module UrlHelpers def self.remove_helpers! self.instance_methods.map(&:to_s).grep(/_(url|path)$/).each do |method| diff --git a/lib/devise/failure_app.rb b/lib/devise/failure_app.rb index bf362288..372756a7 100644 --- a/lib/devise/failure_app.rb +++ b/lib/devise/failure_app.rb @@ -9,7 +9,9 @@ module Devise include ActionController::RackDelegation include ActionController::UrlFor include ActionController::Redirecting + include Rails.application.routes.url_helpers + include Rails.application.routes.mounted_helpers delegate :flash, :to => :request @@ -73,8 +75,10 @@ module Devise route = :"new_#{scope}_session_path" opts[:format] = request_format unless skip_format? - if respond_to?(route) - send(route, opts) + context = send(Devise.router_name) + + if context.respond_to?(route) + context.send(route, opts) elsif respond_to?(:root_path) root_path(opts) else diff --git a/lib/devise/rails.rb b/lib/devise/rails.rb index 5734d3c5..e7aa3f40 100644 --- a/lib/devise/rails.rb +++ b/lib/devise/rails.rb @@ -42,6 +42,15 @@ module Devise end end + initializer "devise.fix_routes_proxy_missing_respond_to_bug" do + # We can get rid of this once we support Rails > 3.2 + ActionDispatch::Routing::RoutesProxy.class_eval do + def respond_to?(method, include_private = false) + super || routes.url_helpers.respond_to?(method) + end + end + end + initializer "devise.deprecations" do unless defined?(Rails::Generators) if Devise.case_insensitive_keys == false diff --git a/test/failure_app_test.rb b/test/failure_app_test.rb index 1108218c..b97fb627 100644 --- a/test/failure_app_test.rb +++ b/test/failure_app_test.rb @@ -3,7 +3,9 @@ require 'ostruct' class FailureTest < ActiveSupport::TestCase class RootFailureApp < Devise::FailureApp - undef_method :new_user_session_path + def fake_app + Object.new + end end def self.context(name, &block) @@ -41,10 +43,12 @@ class FailureTest < ActiveSupport::TestCase end test 'return to the root path if no session path is available' do - call_failure :app => RootFailureApp - assert_equal 302, @response.first - assert_equal 'You need to sign in or sign up before continuing.', @request.flash[:alert] - assert_equal 'http://test.host/', @response.second['Location'] + swap Devise, :router_name => :fake_app do + call_failure :app => RootFailureApp + assert_equal 302, @response.first + assert_equal 'You need to sign in or sign up before continuing.', @request.flash[:alert] + assert_equal 'http://test.host/', @response.second['Location'] + end end test 'uses the proxy failure message as symbol' do