rails 基本的なログインシステム Part4 永続的なログインシステム 後編
すること
ユーザーの永続的ログインシステムの続き
- 管理人をユーザーモデルで作成
- ログインのcontroller作成やルーティング設定
- ログインのビュー作成
- ログイン機能作成
- ちょっと発展機能を加える
- ログイン機能を実装したことによって利用できること
5のログイン機能の実装まで完了しました!
リメンバーミーボタンを作成していきます。
前回記事↓
ryo10leo.hatenablog.com
Remember me チェックボックス
プロ仕様の完全な認証システムが導入しました。
ユーザーにログイン状態を保持するか選択させるremember meチェックボックスをログインフォームに追加していきます。
チェックしなかったら一時セッション(session)へ、チェックしたら永続的なセッション(cookies)へ分岐させます。
ログインフォームはこんな感じでした。
<div id="form"> <h1>Login</h1> <%= form_for(:session, url: login_path) do |f| %> <div class="form-item"> <p class="formLabel">Email</p> <%= f.email_field :email, class: 'form-style form-control',autocomplete: 'off' %> </div> <div class="form-item"> <p class="formLabel">Password</p> <%= f.password_field :password, class: 'form-style form-control' %> </div> <%= f.submit "Log in", class: "login pull-right" %> <% end %> </div>
ここに以下のコードを追加します。
>|html|
<%= f.label :remember_me, class: "checkbox inline" do %>
<%= f.check_box :remember_me %>
ログイン状態を保持する
<% end %>
こんな感じ↓
<div id="form"> <h1>Login</h1> <%= form_for(:session, url: login_path) do |f| %> <div class="form-item"> <p class="formLabel">Email</p> <%= f.email_field :email, class: 'form-style form-control',autocomplete: 'off' %> </div> <div class="form-item"> <p class="formLabel">Password</p> <%= f.password_field :password, class: 'form-style form-control' %> </div> <div class="check-wrapper"> <%= f.label :remember_me, class: "checkbox inline" do %> <%= f.check_box :remember_me %> <span>ログイン状態を保持する</span> <% end %> </div> <%= f.submit "Log in", class: "login pull-right" %> <% end %> </div>
これで送信が行われた時に、params[:session][:remember_me]で値を参照できます。
チェックボックスがオンのときは'1'、オフの時は'0'と読み取れます。
見た目を整えます。
.checkbox { span { font-size: 0.8125rem; margin-left: 10px; font-weight: normal; } } #session_remember_me { width: auto; margin-left: 0; }
ビューはこれで完成です!
session_controllerのcreateアクションで以下の行を追加します。
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
これは送信されたチェックボックス値が1の場合、つまりオンの場合にremember(user)メソッドが実行されて、永続ログインが作動します。逆に値が0だった場合は、永続ログインを破棄することができます。簡潔に書くために「三項演算子」を使っています。
最終的にcreateメソッドはこのような感じになります。
sessions_controller.rb ・ ・ def create user = User.find_by(email: params[:session][:email].downcase) if user && user.authenticate(params[:session][:password]) log_in user params[:session][:remember_me] == '1' ? remember(user) : forget(user) redirect_to root_url else flash.now[:danger] = '有効なメールアドレス、またはパスワードではありません。' render 'new' end end ・ ・
自分は最終的にはこんな感じになりました!
最後の記事は、自分がどのようにログイン機能を活用しているかを書いていきたいと思います。