Implementieren Sie die Anmeldefunktion mithilfe der Sitzung. Verstehen, wie Sitzung verwendet wird (Sitzung [: Benutzer_ID] = 1)
Ein Mechanismus zur Realisierung einer zustandsbehafteten Kommunikation.
Bei der normalen (zustandslosen) Browserkommunikation werden alle Informationen auf der vorherigen Seite bei jedem Seitenwechsel zerstört. Mit anderen Worten, selbst wenn Sie sich auf der vorherigen Seite anmelden, werden die Informationen, die Sie angemeldet haben, beim Wechseln zur nächsten Seite nicht vererbt, sodass Sie sich bei jedem Umzug anmelden müssen. (Sehr unpraktisch)
Daher ist es notwendig, eine zustandsbehaftete Kommunikation zu realisieren, die die Informationen auf der vorherigen Seite übernehmen kann. Insbesondere kann eine zustandsbehaftete Kommunikation durch Speichern von Daten in einem Cookie realisiert werden.
Erstellen Sie eine Anmeldefunktion, ohne gem "devise" zu verwenden.
Ruby 2.6.3 Rails 6.0.3.3 Verwenden Sie gem "bcrypt" (für die Passwortverschlüsselung)
Terminal
#Dateierstellung ~ Schienen s
mkdir rails
cd rails
rails new rails_login_session
cd rails_login_session
rails s
Erstellen Sie eine Datei, um die Anmeldefunktion hinzuzufügen localhost: 3000 und sag Yay! Du bist auf Schienen!
Gemfile und Terminal
gem "bcrypt"
bundle install
Starten Sie einen Editor (Atom, VScode usw.), kommentieren Sie das Gem "bcrypt" in der Gemfile aus und installieren Sie das Bundle im Terminal.
Terminal
rails g model User email:uniq password:digest
#Stellen Sie sicher, dass die Datei generiert wird
rails db:migrate
Erstellen eines Benutzermodells
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
Erstellen eines Home-Controllers und eines Benutzer-Controllers Routing-Änderungen
: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
Nachdem Sie den Server mit Rails s gestartet haben, greifen Sie auf localhost: 3000 / user / new zu und versuchen Sie, sich mit einer entsprechenden E-Mail und einem entsprechenden Kennwort anzumelden. OK, wenn Sie bestätigen können, dass keine Fehler vorliegen
Terminal
rails g controller sessions new
Erstellen Sie einen Sitzungscontroller
config/routes.rb
root 'home#top'
resource :user, only: [:new, :create, :show]
#Fügen Sie die folgenden 3 Zeilen hinzu
get 'login', to: "sessions#new"
post 'login', to: "sessions#create"
delete 'logout', to: "sessions#destroy"
Routing-Änderungen
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
create create 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 %>
Ansicht erstellen Ich habe auch <% = link_to "Login", login_path%> zu users / new.html.erb in der Zeile unter submit hinzugefügt. Nachdem Sie bestätigt haben, dass Sie sich erfolgreich anmelden können, wird als Nächstes eine Flash-Meldung angezeigt.
:app/views/layouts/application.html.erb
<body>
#Fügen Sie die folgenden zwei Zeilen hinzu und schließen Sie die Ausbeute in div-Tags ein
<%= notice %>
<%= alert %>
<div class="container">
<%= yield %>
</div>
</body>
Jetzt sehen Sie die Flash-Nachricht. Ich plane, CSS später auf div class = "conteiner" anzuwenden, also füge ein div-Tag hinzu.
app/controllers/sessions_controller.rb
def destroy
session[:user_id] = nil
redirect_to root_path, notice: "you have successfully logout"
end
Zerstörungsaktion hinzugefügt
:app/views/users/show.html.erb
<h1>Welcome</h1>
<p>you are login</p>
<%= link_to "Logout", logout_path, method: :delete %>
Wenn Sie über eine Schaltfläche zum Abmelden verfügen, können Sie eine entsprechende Ansicht erstellen Überprüfen Sie, ob Sie sich mit Rails abmelden können, und sehen Sie eine Flash-Meldung.
:app/views/home/top.html.erb
<h1>Hello</h1>
<%= link_to "Sign up", new_user_path %>
<%= link_to "Log in", login_path %>
Sie können sich jetzt von der oberen Seite aus anmelden und registrieren.
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
#Fügen Sie oben neue Aktion hinzu
before_action :already_login?, except: :destroy
app/controllers/users_controller.rb
#Fügen Sie oben neue Aktion hinzu
before_action :already_login?, only: [:new, :create]
before_action :login?, only: :show
Für einen angemeldeten Benutzer ist es problematisch, zum Anmeldebildschirm oder zum neuen Registrierungsbildschirm zu wechseln. Im Gegenteil, es besteht das Problem, dass ein Benutzer, der nicht angemeldet ist, den Benutzerbildschirm aufrufen kann. Damit sind die beiden oben genannten Probleme gelöst.
: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 %>
Geändert, um die E-Mails des Benutzers anzeigen zu können, der bei users / show.html.erb angemeldet ist
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;
}
das ist alles.
Recommended Posts