2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Rails】ログイン機能について

Posted at

sessionを使用したrailsのログイン機能についてのメモです。

ログイン機能の概要

sessionにユーザの情報があるかどうかを判断します。

sessionにユーザの情報が無い場合
→サインイン(ユーザ登録画面)へ
sessionにユーザの情報がある場合
→ログイン後のページを表示

というのがログイン機能基本的な流れかなと思います。

railsでは、sessionにユーザの情報を自動で暗号化して保持することができるので、こちらで考えることは少なくて済みます。

ユーザ登録について簡単にあとめた記事も公開しているので、参考にしてください。

コントローラ

ログイン機能で実装するのは、new,create,destroyのアクションです。

下記のコードがログイン機能のコントローラです。

session.rb
class SessionsController < ApplicationController
  def new
  end

  def create
    email = params[:session][:email].downcase
    password = params[:session][:password]
    if login(email, password)
      flash[:success] = 'ログインにしました'
      redirect_to @user
    else
      flash.now[:danger] = 'ログインに失敗しました'
      render 'new'
    end
  end

  def destroy
    session[:user_id] = nil
    flash[:success] = 'ログアウトしました'
    redirect_to root_url
  end

  private

  def login(email, password)
    @user = User.find_by(email: email)
    if @user && @user.authenticate(password)
      session[:user_id] = @user.id
      return true
    else
      return false
    end
  end
end

createアクションでは、ログインに成功すると、ユーザの詳細画面へ、ログインに失敗すればもう一度ログイン画面へとページ移行するようになっています。

login(email, password)では、入力されたemailとpasswordを引数に取り、ユーザが登録しているかどうかの確認を行っています。

view画面

ログイン画面です。CSSを適用していない最低限の画面です。笑

index.html
<%= form_for(:session, url: login_path) do |f| %>
    
    <div class="form-group">
        <%= f.label :email, 'Email' %>
        <%= f.email_field :email, class: 'form-control' %>
    </div>

    <div class="form-group">
        <%= f.label :password, 'Password' %>
        <%= f.password_field :password, class: 'form-control' %>
    </div>

    <%= f.submit 'Log in', class: 'btn btn-primary btn-block' %>
<% end %>

<p>New user? <%= link_to 'サインアップ画面', signup_path %></p>

超見にくいですが、最低限のログイン画面です。
サインアップ画面は、ユーザ登録に記述してあります。

スクリーンショット (45).png

ログイン後の画面ですが、
下記のコードの中にログイン後に表示したいコードを記述します。

<% if logged_in? %>

ログイン後に表示したいコード

<% end %>

ログイン要求画面

ユーザがログインしていない場合に、ログインを要求する機能です。

アプリケーションコントローラに実装し、どのコントローラからでも呼び出せるようにします。

application_controller.rb
class ApplicationController < ActionController::Base

    def require_user_logged_in
        unless logged_in?
            redirect_to login_url
        end
    end

    def current_user
        @current_user ||= User.find_by(id: session[:user_id])
    end

    def logged_in?
        !!current_user
    end

end

require_user_logged_inによって、ユーザがログインしているかどうか判別するコードです。
アプリケーションコントローラに記述しているので、ほかのコントローラでも呼び出すことが出来ます
before_actioの中に記述するのがスマートです。

before_action :require_user_logged_in, only: [:index, :show]

以上です!これでログイン機能が実装できているはず!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?