読者です 読者をやめる 読者になる 読者になる

ぞえの技術めも

Ruby on Rails勉強中

【78日目】【1日20分のRailsチュートリアル】【第8章】ログインしているユーザーのユーザー名を取得する

Ruby on Railsチュートリアル(第3版)

今日は「8.2.2 現在のユーザー」から。

8.2.2 現在のユーザー

今度はそのユーザーIDを別のページで取り出すことにしましょう。
そのためには、current_userメソッドを定義して、セッションIDに対応するユーザー名をデータベースから取り出せるようにします。

一時セッションからid取得して、そのユーザーidを元にデータベース内を検索する処理を組めば良さそう。

ユーザーIDが存在しない状態でfindを使用すると例外が発生してしまいます。
(中略)
createメソッド内でメールアドレスの検索に使ったのと同じfind_byメソッドを使うことにします。

ふむふむ。

User.find_by(id: session[:user_id])

しかし少し残念なのは、current_userがページ内で複数使用されていると、同じ回数だけデータベースも呼び出されてしまうことです。`

find_byメソッドを使う度にデータベースアクセスが発生する、ってことですね。
データベースに保存されているデータが多いほど検索時間かかるし、無駄にアクセス増やしたくないよね。

ってことでUser.find_byの実行結果をインスタンス変数に保存しておく方法がRailsの慣習らしい。

@current_userへの代入は、Rubyでは以下のような短縮形で書くのが王道です。

@current_user ||= User.find_by(id: session[:user_id])

へぇぇ…。Javaとかでは見たことない気がするなぁ。。。
コラム8.1読んでなんとなく分かったような。覚えないといけないね。

current_userメソッドは最終的にこうなりました。

app/helpers/sessions_helper.rb

  # 現在ログインしているユーザーを返す (ユーザーがログイン中の場合のみ)
  def current_user
    @current_user ||= User.find_by(id: session[:user_id])
  end

今日の作業時間は【17分】

次は「8.2.3 レイアウトリンクを変更する」から。