sessionを使用したrailsのログイン機能についてのメモです。
ログイン機能の概要
sessionにユーザの情報があるかどうかを判断します。
sessionにユーザの情報が無い場合
→サインイン(ユーザ登録画面)へ
sessionにユーザの情報がある場合
→ログイン後のページを表示
というのがログイン機能基本的な流れかなと思います。
railsでは、sessionにユーザの情報を自動で暗号化して保持することができるので、こちらで考えることは少なくて済みます。
ユーザ登録について簡単にあとめた記事も公開しているので、参考にしてください。
コントローラ
ログイン機能で実装するのは、new,create,destroyのアクションです。
下記のコードがログイン機能のコントローラです。
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を適用していない最低限の画面です。笑
<%= 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>
超見にくいですが、最低限のログイン画面です。
サインアップ画面は、ユーザ登録に記述してあります。
ログイン後の画面ですが、
下記のコードの中にログイン後に表示したいコードを記述します。
<% if logged_in? %>
ログイン後に表示したいコード
<% end %>
ログイン要求画面
ユーザがログインしていない場合に、ログインを要求する機能です。
アプリケーションコントローラに実装し、どのコントローラからでも呼び出せるようにします。
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]
以上です!これでログイン機能が実装できているはず!