[Débutant] À propos de la session Rails

introduction

Maintenant que nous avons terminé le chapitre 8 du didacticiel Rails, je vais publier sur Session en tant que sortie.

La différence entre apatride et avec état

Le protocole qui sous-tend Internet, «HTTP», est «sans état». Puisqu'il n'y a littéralement aucun "état", chaque "requête HTTP" n'hérite pas des informations de la requête précédente. Il est facile à comprendre en regardant l'exemple suivant.

"Exemple avec état" Client: Bonjour Greffier: Bienvenue. Bienvenue chez XX Burger Client: je voudrais un ensemble de hamburgers Greffier: Que souhaitez-vous pour le menu latéral? Client: avec des pommes de terre Greffier: Qu'aimeriez-vous boire? Client: Chez Ginger Ale Greffier: Que diriez-vous de faire une boisson taille L pour +50 yens? Client: M va bien Greffier: Voulez-vous vraiment faire cela? Client: Oui Greffier: je suis intelligent

"Exemple sans état" Client: Bonjour Greffier: Bienvenue. Bienvenue chez XX Burger Client: je voudrais un ensemble de hamburgers Greffier: Que souhaitez-vous pour le menu latéral? Client: Veuillez me donner un ensemble de hamburgers avec des pommes de terre Greffier: Qu'aimeriez-vous boire? Client: Veuillez me donner un ensemble de hamburgers avec pommes de terre et soda au gingembre Greffier: Que diriez-vous de faire une boisson taille L pour +50 yens? Client: Veuillez me donner un ensemble de hamburgers avec pommes de terre et soda au gingembre (M) Greffier: Voulez-vous vraiment faire cela? Client: Veuillez me donner un ensemble de hamburgers avec pommes de terre et soda au gingembre (M). c'est tout Greffier: je suis intelligent

Dans l'exemple «avec état», le commis (serveur) se souvient de l'état de la commande du client (client) (il hérite des informations précédentes). C'est ce qu'on appelle l'état de l'application ou l'état de session. D'autre part, vous pouvez voir que apatride ne se souvient pas du statut de la commande (il ne reporte pas les informations précédentes). Cela peut poser un problème s'il est "apatride". C'est à ce moment que vous utilisez des fonctionnalités telles que «authentification de connexion» et «panier». Si vous oubliez la communication précédente, vous devez effectuer des traitements tels que "authentification de connexion" et "chaque fois que vous voulez plus de produits, remettez tout dans le panier, y compris les produits que vous avez mis dans le passé".

Qu'est-ce qu'une session?

session est une fonction qui se souvient que vous êtes" connecté "afin que vous n'ayez pas à vous reconnecter même si vous changez de page après vous être connecté. En d'autres termes, c'est un mécanisme pour réaliser une communication avec état.

Mettre en œuvre la fonction de connexion

Nous allons sauter la création des contrôleurs et du routage, et commencer par créer le formulaire de connexion.

La plus grande différence entre un formulaire de session et un formulaire d'inscription utilisateur est qu'il n'y a pas de modèle de session pour une session, il n'y a donc pas d'équivalent à une variable d'instance comme @user. Par conséquent, les informations que vous devez transmettre au form_with helper lors de la création d'un nouveau formulaire de session sont légèrement différentes.

form_with(model: @user, local: true)

Rails détermine automatiquement que "l'action du formulaire est un POST vers l'URL / les utilisateurs" simplement en écrivant comme ci-dessus, mais dans le cas d'une session, la portée de la ressource (ici, la session) et son correspondant Vous devez spécifier l'URL spécifiquement.

form_with(url: login_path, scope: :session, local: true)

Notez que les données du formulaire scope :: session => vont dans: session.

Ensuite, le contenu entré dans le formulaire de connexion est reçu par l'action de création du contrôleur de session, et l'utilisateur est trouvé dans la base de données et vérifié.

sessions_controller.rb


  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      #Redirection vers la page d'informations de l'utilisateur après la connexion de l'utilisateur
    else
      #Créer un message d'erreur
      render 'new'
    end
  end
user = User.find_by(email: params[:session][:email].downcase)

(1) Recevez l'adresse e-mail saisie dans le formulaire de connexion avec les paramètres, récupérez les informations utilisateur de la base de données avec find_by et utilisez la méthode downcase pour garantir une correspondance lorsqu'une adresse e-mail valide est saisie.

if user && user.authenticate(params[:session][:password])

(2) Vérifiez si l'utilisateur est nul et authentifiez-vous avec la «méthode d'authentification».

méthode log_in

session[:user_id] = user.id

Lorsque vous exécutez le code ci-dessus, vous pouvez l'enregistrer dans le navigateur avec la méthode de session et accéder au navigateur comme une variable.

#Connectez-vous en tant qu'utilisateur passé
  def log_in(user)
    session[:user_id] = user.id
  end

current_user (utilisateur actuellement connecté)

Si vous êtes connecté, utilisez current_user pour renvoyer des informations sur cet utilisateur. Utilisez également l'instruction if pour réduire le nombre de requêtes de base de données.

 #Renvoie l'utilisateur actuellement connecté (le cas échéant)
  def current_user
    if session[:user_id]
      @current_user ||= User.find_by(id: session[:user_id])
    end
  end

Modifier le lien de mise en page

Modifiez ensuite la mise en page lorsque l'utilisateur est connecté et lorsqu'il ne l'est pas. Pour cela, nous avons besoin d'une méthode qui renvoie la valeur logique de savoir si nous sommes connectés ou non, nous allons donc l'implémenter. L'état dans lequel l'utilisateur est connecté signifie que "l'ID utilisateur existe dans la session", c'est-à-dire l'état dans lequel "utilisateur_actuel" n'est pas "nul".

#Renvoie vrai si l'utilisateur est connecté, faux sinon
  def logged_in?
    !current_user.nil?
  end

Utilisez la méthode log_in?, Qui renvoie une valeur logique, pour modifier la disposition comme suit:

<% if logged_in? %>
  #Lien pour l'utilisateur connecté
<% else %>
  #Lien pour les utilisateurs qui ne sont pas connectés
<% end %>

Se déconnecter

Pour vous déconnecter, supprimez l'ID utilisateur de la session.

#Déconnectez l'utilisateur actuel
  def log_out
    session.delete(:user_id)
    @current_user = nil
  end

Recommended Posts

[Débutant] À propos de la session Rails
À propos du routage des rails
[Rails] À propos d'ActiveJob,!
À propos du contrôleur Rails
[Débutant] Tutoriel Rails
[Rails 6] À propos des principaux joyaux
[Rails] À propos du hachage actif
À propos de la spécification de version des rails
[Débutant] À propos du stockage actif
[rails] concevoir les valeurs par défaut
rails Paramètres forts
[Swift] [Débutant]] À propos de l'opérateur de plage
A propos de l'attribution d'un nom aux méthodes de modèle Rails
J'ai essayé Rails débutant [Chapitre 1]
[Rails] À propos de la structure des dossiers scss
[Rails] À propos du test de réponse Rspec
J'ai essayé Rails débutant [Chapitre 2]
À propos de la méthode de raclage des rails Mechanize
[Débutant] Lorsque les rails ne fonctionnent pas
[Rails] Paramètre de délai d'expiration de session dans l'appareil
À propos du symbole <%%> dans Rails erb
[Java débutant] À propos de l'abstraction et de l'interface
[Rails] À propos de la mise en œuvre de la fonction similaire
Considération sur les rails et l'architecture propre
[Rails] Conservation temporaire des données par session
[Rails6] Créer une nouvelle application avec Rails [Débutant]
[Rails 6.0] À propos de la sauvegarde par lots de plusieurs enregistrements
Déployer sur Heroku [Ruby on Rails] Débutant
[Ruby on Rails] À propos du rappel Active Record
[Java débutant] À propos de l'initialisation d'un tableau multidimensionnel
[Rails] À propos de local: true décrit dans form_with
[Rails 5] Créer une nouvelle application avec Rails [Débutant]
[Rails] Différence entre redirect_to et render [Débutant]