Comment rediriger un utilisateur vers sa page d'accueil s'il est déjà connecté?
J'utilise Ruby 2.3 avec Rails 5. Si quelqu'un visite la page de connexion dans mon application et qu'il est déjà connecté, je souhaite le rediriger vers la page d'accueil de son utilisateur. Cependant, en suivant ce lien - Rediriger l'utilisateur après la connexion uniquement s'il est sur root_path , je ne peux pas le faire fonctionner. Je les ai ajoutés à mon fichier config / routes.rb
root :to => "users/", :constraints => {user_signed_in?}
root :to => redirect('/login')
Et j'ai créé le fichier lib / authenticated_user.rb avec ce contenu
class AuthenticatedUser
def self.matches?(request)
user_signed_in?
end
end
Cependant, lorsque je visite ma page racine, j'obtiens cette erreur
/Users/nataliab/Documents/workspace/sims/config/routes.rb:17: syntax error, unexpected '}', expecting =>
root :to => "users/", :constraints => {user_signed_in?}
Que dois-je faire d'autre pour que cela fonctionne?
Edit: Ceci est mon fichier complet config / routes.rb, édité après la réponse donnée
Rails.application.routes.draw do
get '/signup', to: 'users#new'
get '/forgot_password', to: 'users#forgot_password'
get '/login', to: 'sessions#new'
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
get '/dashboard' => 'users#show', as: :dashboard
resources :users
resources :scenarios do
get :download
resources :confidential_memos
end
resources :scenario_files, :only => %i[ show ]
root :to => "/dashboard", constraints: lambda { |user| user.user_signed_in? }
root :to => redirect('/login')
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
J'ai cela défini dans app / helpers / sessions_helper.rb
def current_user
@current_user ||= User.find_by(id: session[:user_id])
end
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
Votre problème de base est que vous fournissez un booléen entre accolades qui n'est pas une syntaxe invalide. Les accolades signifient un hachage ou un bloc. La section 3.10 du guide de routage des rails, disponible ici , explique ce que vous voulez probablement faire. Il existe d'autres options dans la section 3 qui pourraient fournir une solution.
Selon le guide et les informations que vous avez fournies, une solution serait
root :to => "users/", constraints: lambda { |request| user_signed_in?(request) }
En fonction de votre solution de sécurité, cela a le souci que l'utilisateur_signed_in? doit être disponible et doit pouvoir identifier l'utilisateur à l'aide de la requête HTTP.
EDIT: J'ai travaillé avec votre table de routage, y apportant des modifications jusqu'à ce que Rails l'aime. Il n'aimait pas la barre oblique principale et il n'aimait pas avoir deux chemins racine, même avec la contrainte. Voici une configuration recommandée, même si vous devrez peut-être la modifier pour vous assurer qu'elle fait exactement ce que vous voulez:
get 'signup', to: 'users#new'
get 'forgot_password', to: 'users#forgot_password'
get 'login', to: 'sessions#new'
post 'login', to: 'sessions#create'
delete 'logout', to: 'sessions#destroy'
get 'dashboard' => 'users#show', as: :dashboard
resources :users
resources :scenarios do
get :download
resources :confidential_memos
end
resources :scenario_files, :only => %i[ show ]
get '/', to: 'users#show', constraints: lambda { |request| user_signed_in?(request) }
root :to => redirect('/login')
Cela a les préoccupations que j'ai mentionnées ci-dessus en ce que le user_signed_in? doit être disponible et doit pouvoir identifier l'utilisateur à l'aide de la requête HTTP.
Recommandation:
root to: 'sessions#check'
Et là:
def check
if logged_in?
return redirect_to user_profiles_path
else
# You could execute the new method here, or:
return redirect_to user_login_path
end
end
Ce n'est pas exactement RESTful, et il pourrait à la place être intégré dans les sessions # new si vous préférez le faire.
Alternatif , basé sur la suggestion de Duyet:
root to: 'sessions#new'
Et, ensuite en sessions uniquement:
before_action :user_authenticated, only: [:new]
def user_authenticated
if logged_in?
return redirect_to user_profiles_path
end
end