Implementierung der Ruby on Rails-Anmeldefunktion (Sitzung)

Überblick

Implementieren Sie die Anmeldefunktion mithilfe der Sitzung. Verstehen, wie Sitzung verwendet wird (Sitzung [: Benutzer_ID] = 1)


Was ist eine Sitzung?

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.


Dieses Ziel und meine Umgebung

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)


Implementierung

Anmeldefunktion (neue Registrierung) erstellen

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

Anmeldefunktion erstellen

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.

Abmeldefunktion erstellen

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.

Sonstige Anpassungen

: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

Implementierung der Ruby on Rails-Anmeldefunktion (Sitzung)
Implementierung der Ruby on Rails-Anmeldefunktion (Devise Edition)
[Ruby on Rails] Implementierung einer ähnlichen Funktion
[Ruby on Rails] Implementierung der Kommentarfunktion
[Rails] Hinzufügen der Ruby On Rails-Kommentarfunktion
[Ruby on Rails] Folgen Sie der Funktionsimplementierung: Bidirektional
Validierungseinstellungen für die Ruby on Rails-Anmeldefunktion
Ruby on Rails Implementierung der automatischen Mail-Sendefunktion
[Rails] Implementierung der Kategoriefunktion
[Rails] Implementierung der Tutorial-Funktion
[Rails] Implementierung einer ähnlichen Funktion
[Ruby on Rails] Asynchrone Kommunikation der Posting-Funktion, Ajax
Erklärung von Ruby on Rails für Anfänger ⑦ ~ Flash-Implementierung ~
[Rails] Implementierung der CSV-Importfunktion
[Rails] Asynchrone Implementierung der Like-Funktion
[Ruby on Rails] Paging-Funktion eingeführt
[Rails] Implementierung der Bildvorschau
Grundkenntnisse in Ruby on Rails
[Rails] Über die Implementierung der Like-Funktion
[Rails] Implementierung der Benutzerrückzugsfunktion
[Rails] Implementierung der CSV-Exportfunktion
[Ruby on Rails] CSV-Ausgabefunktion
[Ruby on Rails] DM, Chat-Funktion
Ein Hinweis zum Seed-Feature von Ruby on Rails
[Ruby on Rails] Implementieren Sie die Anmeldefunktion von add_token_to_users mit API
[Ruby on Rails] Einführung der Anfangsdaten
[Ruby on Rails] Suchfunktion (nicht ausgewählt)
Schienen Hinzufügen einer einfachen Anmeldefunktion
Rails [Für Anfänger] Implementierung der Kommentarfunktion
[Ruby on Rails] Japanische Fehlernotation
Erklärung von Ruby auf Schienen für Anfänger ①
[Ruby on Rails] Logisches Löschen (Auszahlungsfunktion)
[Rails] Implementierung der Suchfunktion mit Gem's Ransack
[Ruby on Rails] Bis zur Einführung von RSpec
[Rails] Implementierung der Bildvergrößerungsfunktion mit Lightbox2
Empfehlung der Serviceklasse in Ruby on Rails
Implementierung der Suchfunktion
Ruby on Rails ~ Grundlagen von MVC und Router ~
Ruby on Rails Elementary
[Ruby on Rails] Ein Memorandum mit Layoutvorlagen
Ruby on Rails Grundlagen
Implementierung der Pagenationsfunktion
Ruby On Rails Association
Ruby on Rails So implementieren Sie die automatische Adresseneingabe
[Ruby on Rails] Nachbearbeitungsfunktion (Aktualisieren, Löschen)