Railsでログイン後に表示内容を変えてみる
こんにちは。
railsを学習中の者です。
転職に向けてポートフォリオ作成と並行して、CRUD操作などの復習をしています。
Railsでユーザー認証を導入したあと、 「ログインしている人にだけ特定のメニューや情報を表示したい!」と思い、実装しようと思いました。
備忘録のため、Rails初学者の自分が実際に試してうまくいった「ログイン状態による表示切り替え」の方法をまとめます。
使っている認証ツール:Devise
Deviseを使って以下の機能は導入済み:
- ログイン/ログアウト
- 新規登録
- パスワードリセット
以降ではこの状態を前提に進めます。
ログイン状態の確認方法:user_signed_in?
Deviseを使っていると、以下のヘルパーメソッドが自動で使用可能。
-
user_signed_in?
:ログインしているかどうか(真偽値) -
current_user
:現在ログインしているユーザー情報(User
モデルのインスタンス)
実際に試した表示切り替えの実装
例:ログインしている人だけに「マイページ」リンクを表示したい
<!-- app/views/layouts/application.html.erb や ナビゲーションの部分 -->
<nav>
<% if user_signed_in? %>
<%= link_to "マイページ", user_path(current_user), class: "text-blue-600" %>
<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
<% else %>
<%= link_to "ログイン", new_user_session_path %>
<%= link_to "新規登録", new_user_registration_path %>
<% end %>
</nav>
実装のポイント
user_signed_in?
を使うだけで、ログイン状態に応じた分岐が可能
current_user
を使えば、ログインユーザーの情報(名前やID)も使える
応用:ログイン時だけダッシュボード風の表示を出す
<!-- app/views/pages/home.html.erb などトップページ -->
<% if user_signed_in? %>
<h2 class="text-xl font-bold">ようこそ、<%= current_user.name %>さん!</h2>
<p>あなた専用のメニューはこちら</p>
<% else %>
<p>この機能を使うにはログインしてください。</p>
<% end %>
未ログインでcurrent_user
を使うとエラーになることがある
ログインしていない状態でcurrent_user.name
などを直接呼び出すとnil
に対してメソッドを呼ぶことになり、NoMethodError
が出てしまうことがある。
user_signed_in?
で存在確認してから使うのが安全。
補足:controller内でログイン状態を使う
ビューだけでなく、コントローラでもログイン状態に応じた処理の分岐が可能。
# app/controllers/articles_controller.rb
def index
if user_signed_in?
@articles = current_user.articles
else
@articles = Article.all.limit(5)
end
end
-
user_signed_in?
Deviseが提供しているメソッドで、「ユーザーがログイン中かどうか」をtrue/false
で返す。 -
current_user
ログインしているユーザー(Userモデルのインスタンス)を返す。未ログイン時はnil
。
学んだこと
- deviseを使うと
user_signed_in?
とcurrent_user
が使える - ERB内で分岐して、ログイン状態によって表示内容を変えられる
- ちょっとした分岐でUXが大きく変わる
こんな場面に使えるらしい
- ログインユーザー専用の「マイ記事一覧」
- 未ログインユーザー向けの「新着紹介」や「登録を促すUI」
- 管理者と一般ユーザーで別の情報を表示する など
最後
今回紹介した方法は、Rails初学者の自分が実際に「やってみてうまくいった」ログイン状態による表示切り替えの一例である。
最初のうちは current_user
をどう扱うのか、nil
のときにどう対処するのかで悩みました。
だからこそ、こうした基本的な仕組みをしっかり理解して応用できるようになりたいと感じています。
※初学者のため、知識が浅いです。
間違えていたら、すいません。