Comment rediriger un utilisateur vers sa page d'accueil s'il est déjà connecté?


utilisateur7055375

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
Richard_G

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

Articles connexes


comment rediriger vers la page d'accueil

Steven Spielberg : Comment puis-je rediriger un utilisateur vers la page d'accueil? Exemple: mywebsite.com/ddfdf/fdfdsf et je souhaite rediriger vers mywebsite.com Cependant, je veux le faire sans taper le nom statique. Comment puis-je faire ceci? Maris Kately

Comment rediriger vers la page d'accueil?

ZedZip La page ConfirmEmail contient: public async Task<IActionResult> OnGetAsync(string userId, string code) { if (userId == null || code == null) { return RedirectToPage("/Index"); // <----------error } var user = await _userManager.