0
0

More than 1 year has passed since last update.

railsチュートリアル第9章 [Remember me]チェックボックス

Posted at

[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)。

思いつかない できない

0
0
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
0
0