2010-11-14 17 views
14

Dans Devise ma demande, je l'authentification des utilisateurs et j'ai remarqué Concevoir que vous pouvez modifier la page que l'on est redirigé vers si le signe en échec. Sur le wiki, j'ai trouvé l'exemple suivant:problèmes Rediriger lorsque l'utilisateur ne peut pas connecter à l'aide

class CustomFailure < Devise::FailureApp 
    def redirect_url 
    new_user_session_url(:subdomain => 'secure') 
    end 

    # You need to override respond to eliminate recall 
    def respond 
    if http_auth? 
     http_auth 
    else 
     redirect 
    end 
    end 
end 

Après cet exemple, je crée ma propre classe CustomFailure (de custom_failure.rb) et placé dans le dossier d'aide (ne savez pas où le mettre). Ceci est la classe suivante, j'ai créé:

class CustomFailure < Devise::FailureApp 
    def redirect_url 
    new_user_session_url(:subdomain => 'secure') 
    end 

    # Redirect to root_url 
    def respond 
    if http_auth? 
     http_auth 
    else 
     root_url 
    end 
    end 
end 

J'ai également ajouté ce qui suit dans la config/initializers/fichier devise.rb (comme les états wiki doit être fait):

config.warden do |manager| 
    manager.failure_app = CustomFailure 
end 

Bien que je reçois pas d'erreur, quand je me connecte incorrectement, il redirige toujours vers la page/users/sign_in (pas la page racine) et rien n'est chargé (la page est complètement blanche même si la source n'est pas vide). Y at-il un problème avec mon cours CustomFailure ou peut-être dans le mauvais dossier?

J'utilise Rails 3.0.1 et DEVISE 1.1.rc0.

Le wiki où ce code se trouve est à l'adresse: How To: Redirect to a specific page when the user can not be authenticated

Répondre

19

Essayez de mettre custom_failure.rb en vous lib dossier car il n'est pas une aide. Ensuite, assurez-vous que le fichier est chargé. Vous essayez probablement de charger automatiquement tous les fichiers dans lib.

EDIT: Pour obtenir un auto chargé lib vous insérerait ce qui suit à votre application.rb:

config.autoload_paths += %W(#{config.root}/lib) 

EDIT2: vous avez oublié d'appeler redirect_to en essayant de rediriger. À l'heure actuelle respond seulement renvoie root_url. Essayez ceci:

def respond 
    if http_auth? 
    http_auth 
    else 
    redirect_to root_url 
    end 
end 

FYI: les gars-Concevoir également effectuer cette redirection avant:

store_location! 
flash[:alert] = i18n_message unless flash[:notice] 
+0

Hmm cela ne fonctionne pas. Il a juste fait la même chose. – Fizz

+0

J'ai repensé votre problème. Essayez mon autre approche - j'espère que cela vous aidera! – pex

+0

merci beaucoup. Ça marche! Je n'ai pas ajouté le store_location! peu, devrais-je faire cela dans ma clause 'else' avant la redirection? – Fizz