Implémentation de la fonction de connexion Ruby on Rails (Session)

Aperçu

Implémentez la fonction de connexion à l'aide de session. Comprendre comment utiliser la session (session [: user_id] = 1)


Qu'est-ce qu'une session

Un mécanisme pour réaliser une communication avec état.

Dans une communication normale de navigateur (sans état), toutes les informations de la page précédente sont détruites chaque fois que la page change. En d'autres termes, même si vous vous connectez sur la page précédente, les informations auxquelles vous êtes connecté ne sont pas héritées lorsque vous passez à la page suivante, vous devrez donc vous connecter à chaque fois que vous vous déplacez. (Très gênant)

Par conséquent, il est nécessaire de réaliser une communication avec état qui peut reprendre les informations de la page précédente. Plus précisément, une communication avec état peut être réalisée en stockant des données dans un cookie.


Cet objectif et mon environnement

Créez une fonction de connexion sans utiliser de gem "devise"

Ruby 2.6.3 Rails 6.0.3.3 Utilisez le gem "bcrypt" (pour le cryptage du mot de passe)


la mise en oeuvre

Créer une fonction de connexion (nouvelle inscription)

Terminal


#Création de fichiers ~ rails s
mkdir rails
cd rails

rails new rails_login_session
cd rails_login_session

rails s

Créer un fichier pour ajouter une fonction de connexion localhost: 3000 et dites Yay! Vous êtes sur Rails!

Gemfile et terminal


gem "bcrypt"

bundle install

Démarrez un éditeur (Atom, VScode, etc.), décommentez le joyau "bcrypt" dans le Gemfile et installez le bundle dans le terminal

Terminal


rails g model User email:uniq password:digest

#Assurez-vous que le fichier est généré
rails db:migrate

Créer un modèle utilisateur

Terminal


rails g controller home top
rails g controller users new show 

config/routes.rb


Rails.application.routes.draw do
  root 'home#top'
  resource :user, only: [:new, :create, :show]
end

Création d'un contrôleur domestique et d'un contrôleur d'utilisateurs Changements de routage

:app/views/users/new.html.erb


<h1>sign up</h1>

<%= form_with model: @user, url: user_path, local: true do |f| %>
    <div class="field">
        <%= f.label :email %>
        <%= f.text_field :email %>
    </div>

    <div class="field">
        <%= f.label :password %>
        <%= f.password_field :password %>
    </div>

    <div class="field">
        <%= f.label :password_confirmation %>
        <%= f.password_field :password_confirmation %>
    </div>

    <div>
        <%= f.submit "sign up" %>
    </div>
<% end %>

app/controllers/users_controller.rb


class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    user = User.new(user_params)
    if user.save
      session[:user_id] = user.id
      redirect_to user_path, notice: "you have successfully sign in"
    else
      render :new
    end
  end

  def show
  end

  private
  def user_params
    params.require(:user).permit(:email, :password, :password_confirmation)
  end
end

Après avoir démarré le serveur avec des rails, accédez à localhost: 3000 / user / new et essayez de vous connecter avec une adresse e-mail et un mot de passe appropriés. OK si vous pouvez confirmer qu'il n'y a pas d'erreur

Créer une fonction de connexion

Terminal


rails g controller sessions new

Créer un contrôleur de sessions

config/routes.rb


root 'home#top'
resource :user, only: [:new, :create, :show]
#Ajoutez les 3 lignes suivantes
get 'login', to: "sessions#new"
post 'login', to: "sessions#create"
delete 'logout', to: "sessions#destroy"

Changements de routage

app/controllers/sessions_controller.rb


lass SessionsController < ApplicationController
  def new
  end

  def create
    user = User.find_by_email(params[:email])
    if user && user.authenticate(params[:password])
      session[:user_id] = user.id
      redirect_to user_path, notice: "you have successfully login"
    else
      flash.now[:alert] = "Email or Password is invalid"
      render :new
    end
  end
end

créer créer une action

:app/views/sessions/new.html.erb


<h1>Login</h1>

<%= form_with url: login_path, local: true do |f| %>
    <div class="field">
        <%= f.label :email %><br>
        <%= f.text_field :email %>
    </div>

    <div class="field">
        <%= f.label :password %><br>
        <%= f.password_field :password %>
    </div>

    <div>
        <%= f.submit "Login" %>
    </div>
    <%= link_to "Sign up", new_user_path %>
<% end %>

Créer une vue J'ai également ajouté <% = link_to "Login", login_path%> à users / new.html.erb sur la ligne sous soumettre. Après avoir confirmé que vous pouvez vous connecter avec succès, affichez ensuite un message flash.

:app/views/layouts/application.html.erb


<body>
#Ajoutez les deux lignes suivantes et placez le rendement dans des balises div
    <%= notice %>
    <%= alert %>
    <div class="container">
      <%= yield %>
    </div>
</body>

Vous verrez maintenant le message flash. Je prévois d'appliquer css à div class = "conteiner" plus tard, alors ajoutez une balise div.

Créer une fonction de déconnexion

app/controllers/sessions_controller.rb


def destroy
  session[:user_id] = nil
  redirect_to root_path, notice: "you have successfully logout"
end

Ajout de l'action de destruction

:app/views/users/show.html.erb


<h1>Welcome</h1>

<p>you are login</p>
<%= link_to "Logout", logout_path, method: :delete %>

Si vous disposez d'un bouton de déconnexion, vous pouvez créer une vue appropriée Vérifiez si vous pouvez vous déconnecter avec les rails et voir un message flash.

Autres ajustements

:app/views/home/top.html.erb


<h1>Hello</h1>

<%= link_to "Sign up", new_user_path %>
<%= link_to "Log in", login_path %>

Vous pouvez maintenant vous connecter et vous inscrire à partir de la première page.

app/controllers/application_controller.rb


class ApplicationController < ActionController::Base
    helper_mathod :current_user

    def login?
        if current_user.nil?
            redirect_to login_path, alert: "you have to login"
        end
    end

    def already_login?
        unless current_user.nil?
            redirect_to user_path, notice: "you are already login"
        end
    end

    def current_user
        if session[:user_id]
            current_user ||= User.find(session[:user_id])
        end
    end
end

app/controllers/sessions_controller.rb


#Ajouter ci-dessus une nouvelle action
before_action :already_login?, except: :destroy

app/controllers/users_controller.rb


#Ajouter ci-dessus une nouvelle action
before_action :already_login?, only: [:new, :create]
before_action :login?, only: :show

Il est problématique pour un utilisateur connecté d'accéder à l'écran de connexion ou au nouvel écran d'enregistrement. Au contraire, il existe un problème en ce qu'un utilisateur qui n'est pas connecté peut accéder à l'écran utilisateur. Avec cela, les deux problèmes ci-dessus ont été résolus.

:app/views/users/show.html.erb


<h1>Welcome</h1>

<p>you are login as "<strong><%= current_user.email %></strong>"</p>
<%= link_to "Logout", logout_path, method: :delete %>

Modifié pour pouvoir afficher le courrier des utilisateurs connectés à users / show.html.erb

app/assets/stylesheets/application.css


.container{
   text-align: center;
 }

 .field{
   margin: 20px 0 20px;
 }

 input{
   width: 400px;
   padding: 10px 15px;
   font-size: 16px;
   border-radius: 3px;
   border: 2px solid #ddd;
 }

c'est tout.

Recommended Posts

Implémentation de la fonction de connexion Ruby on Rails (Session)
Implémentation de la fonction de connexion Ruby on Rails (édition de devise)
[Ruby on rails] Implémentation d'une fonction similaire
[Ruby on Rails] Implémentation de la fonction de commentaire
[Rails] Ajout de la fonction de commentaire Ruby On Rails
[Ruby on Rails] Suivez l'implémentation de la fonction: bidirectionnelle
Paramètres de validation pour la fonction de connexion Ruby on Rails
Ruby on Rails Implémentation de la fonction d'envoi automatique de courrier
[Rails] Implémentation de la fonction de catégorie
[Rails] Implémentation de la fonction tutoriel
[Rails] Implémentation d'une fonction similaire
[Ruby on Rails] Communication asynchrone de la fonction de publication, ajax
Explication de Ruby on rails pour les débutants ⑦ ~ Implémentation Flash ~
[Rails] Implémentation de la fonction d'importation CSV
[Rails] Implémentation asynchrone de la fonction similaire
[Ruby on Rails] Introduction de la fonction de pagination
[Rails] Implémentation de la fonction de prévisualisation d'image
Connaissance de base de Ruby on Rails
[Rails] À propos de la mise en œuvre de la fonction similaire
[Rails] Implémentation de la fonction de retrait utilisateur
[Rails] Implémentation de la fonction d'exportation CSV
[Ruby on Rails] Fonction de sortie CSV
[Ruby on Rails] DM, fonction de chat
Une note sur la fonction de départ de Ruby on Rails
[Ruby on Rails] Implémenter la fonction de connexion par add_token_to_users avec l'API
[Ruby on Rails] Introduction des données initiales
[Ruby on Rails] Fonction de recherche (non sélectionnée)
Rails Ajout d'une fonction de connexion facile et facile
Rails [Pour les débutants] Implémentation de la fonction de commentaire
[Ruby on Rails] Notation japonaise de l'erreur
Explication de Ruby sur rails pour les débutants ①
[Ruby on Rails] Suppression logique (fonction de retrait)
[Rails] Implémentation de la fonction de recherche en utilisant le ransack de gem
[Ruby on Rails] Jusqu'à l'introduction de RSpec
[Rails] Implémentation de la fonction d'agrandissement d'image à l'aide de lightbox2
Recommandation de classe de service dans Ruby on Rails
Implémentation de la fonction de recherche
Ruby on Rails ~ Principes de base de MVC et du routeur ~
Ruby on Rails élémentaire
[Ruby on Rails] Un mémorandum de modèles de mise en page
Principes de base de Ruby on Rails
Mise en œuvre de la fonction de pagénation
Association Ruby On Rails
Ruby on Rails Comment implémenter la saisie d'adresse automatique
[Ruby on Rails] Fonction de post-édition (mise à jour, suppression)