[Remember me]チェックボックス
[remember me]チェックボックスでログインを保持する方法を解説
[remember me]チェックボックスをログインフォームに追加する
app/views/sessions/new.html.erb
<% provide(:title, "Log in") %>
<h1>Log in</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_with(url: login_path, scope: :session, local: true) do |f| %>
<!--セッションの場合はリソースのスコープとそれに対応するURLを具体的に指定する必要-->
<%= f.label :email %>
<%= f.email_field :email, class: 'form-control' %>
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
<%= f.label :remember_me, class: "checkbox inline" do %>
<!--remember_meチェックボックスを追加 うまく動作するために ラベルの内側に配置-->
<%= f.check_box :remember_me %>
<span>Remember me on this computer</span>
<% end %>
<%= f.submit "Log in", class: "btn btn-primary" %>
<% end %>
<p>New user? <%= link_to "Sign up now!", signup_path %></p>
</div>
</div>
[remember me]チェックボックスのCSS
app/assets/stylesheets/custom.scss
/* forms */
.
.
.
.checkbox {
margin-top: -10px;
margin-bottom: 10px;
span {
margin-left: 20px;
font-weight: normal;
}
}
#session_remember_me {
width: auto;
margin-left: 0;
}
remember me]チェックボックスの送信結果を処理する
app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
・
.
.
def create
user = User.find_by(email: params[:session][:email].downcase)
# 送信されたメアドを使ってデータベースから取り出す。
#emailを小文字にする
if user &.authenticate(params[:session][:password])
# user 取得したユーザーが有効かどうか?
# その後にデータベース上にパスワードがあるか?
# ユーザーログイン後にユーザー情報のページにリダイレクトする
# &.は省略型
log_in user
# ユーザーのブラウザ内の一時cookiesに暗号化済みのユーザーIDが自動で作成
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
# ログイン中のremember_meハッシュをオン、オフにする
# 1がオン remember(user)を行う
# 0がオフ forget(user)を行う
# 三項演算子
remember user
# ダイジェストをデータベースに記憶させる
redirect_to user
# 名前付きルート/userのビューを表示する
else
flash.now[:danger] = 'Invalid email/password combination'
# flash.nowでリクエストが発生後メッセージを消滅する
# エラーメッセージを作成する
render 'new'
# newアクションのビューを表示
end
end
.
.
.
演習
1.
ブラウザでcookies情報を調べ、[remember me]をチェックしたときに意図した結果になっているかどうかを確認してみましょう。
remember_token、user_idが削除されていた。
2.
コンソールを開き、三項演算子を使った実例を考えてみてください(コラム 9.2)。
思いつかない できない