LoginSignup
0
0

More than 1 year has passed since last update.

railsチュートリアル第八章 現在のユーザー

Posted at

現在のユーザー

今度はそのユーザーIDを別のページで取り出すことにしましょう。

セッションに含まれる現在のユーザーを検索する

app/helpers/sessions_helper.rb

module SessionsHelper

  # 渡されたユーザーでログインする
  def log_in(user)
    session[:user_id] = user.id
    #sessionメソッドで作成した一時cookiesは自動的に暗号化される
    # ユーザーのブラウザ内の一時cookiesに暗号化済みのユーザーIDが自動で作成
  end

  # 現在ログイン中のユーザーを返す(いる場合)
  def current_user
    if session[:user_id]
    # ログインしているユーザーが有効か?
    # このどちらかの状態の場合、Cookieの有効期限をブラウザ終了時にしても、
    # Chrome側の仕様でCookieを保持し続ける
      @current_user ||= User.find_by(id: session[:user_id])
      # current_userかUser.find_by()のどちらかに入っていればいい。
    end
  end
end

演習

1.Railsコンソールを使って、User.find_by(id: ...)で対応するユーザーが検索に引っかからなかったとき、nilを返すことを確認してみましょう。

>> User.find_by(id:2)
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
=> nil

2.先ほどと同様に、今度は:user_idキーを持つsessionハッシュを作成してみましょう。リスト 8.17に記したステップに従って、||=演算子がうまく動くことも確認してみましょう。

>> session = {}
=> {}

>> session[:user_id] = nil
=> nil

>> @current_user ||= User.find_by(id: session[:user_id])
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT ?  [["LIMIT", 1]]
=> nil

>> session[:user_id]= User.first.id
  User Load (0.2ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> 1

>> @current_user ||= User.find_by(id: session[:user_id])
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
=> #<User id: 1, name: "a", email: "abc@def.com", created_at: "2021-10-05 04:11:41", updated_at: "2021-10-05 04:11:41", password_digest: [FILTERED]>

>> @current_user ||= User.find_by(id: sessiond[:user_id])
=> #<User id: 1, name: "a", email: "abc@def.com", created_at: "2021-10-05 04:11:41", updated_at: "2021-10-05 04:11:41", password_digest: [FILTERED]>

どちらかが返るようになっている。

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