現在のユーザー
今度はそのユーザー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]>
どちらかが返るようになっている。