Implémentez la fonction de connexion à l'aide de session. Comprendre comment utiliser la session (session [: user_id] = 1)
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.
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)
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
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.
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.
: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