Rails 3 w / Devise: Comment définir deux pages d'accueil distinctes selon que l'utilisateur est authentifié ou non?
-
29-10-2019 - |
Question
J'utilise Rails 3 et Devise pour créer une application où les utilisateurs arrivent sur le site Web et voient apparaître une page d'accueil contenant un identifiant et un formulaire d'inscription.Cette page a son propre contrôleur ("page d'accueil") donc son itinéraire est
root :to => "homepage#index"
Je souhaite afficher une page d'accueil différente si les utilisateurs sont déjà connectés. Cela expliquerait que la racine pointe vers
root :to => "dashboard#index"
Existe-t-il un moyen d'avoir une route conditionnelle dans routes.rb, qui me permettrait de vérifier si l'utilisateur est authentifié avant de le router vers l'une de ces pages d'accueil?
J'ai essayé d'utiliser le code suivant mais si je ne suis pas connecté, l'appareil me demande de me connecter, donc clairement, seule la première route fonctionne.
authenticate :user do
root :to => "dashboard#index"
end
root :to => "homepage#index"
De plus, je souhaite que l'URL pointe vers www.example.com dans les deux cas, afin que www.example.com/dashboard/index et www.example.com/homepage/index n'apparaissent jamais dans le navigateur.p>
Merci mille fois !!!
La solution
Essayez ceci, c'est spécifique à Warden / Devise.
root to: "dashboard#index", constraints: lambda { |r| r.env["warden"].authenticate? }
root to: "homepage#index"
Autres conseils
Dans votre HomeController:
def index
if !user_signed_in?
redirect_to :controller=>'dashboard', :action => 'index'
end
end
(Réponses à la même question ici: https://stackoverflow.com/a/16233831/930038 . Ajout durépondez ici aussi pour la référence des autres.)
Dans votre routes.rb
:
authenticated do
root :to => 'dashboard#index'
end
root :to => 'homepage#index'
Cela garantira que root_url
pour tous les utilisateurs authentifiés est dashboard#index
Pour votre référence: https://github.com/plataformatec/devise/pull/1147
Voici la bonne réponse avec les rails 4
root to: 'dashboard#index', constraints: -> (r) { r.env["warden"].authenticate? },
as: :authenticated_root
root to: 'homepage#index'
J'ai essayé d'ajouter ceci à / modifier la réponse acceptée, mais c'est trop une modification pour être acceptée apparemment.Bref, votez pour la réponse acceptée (de Bradley), cela m'a aidé à trouver celle-ci :)