【rails】ログイン状態にあわせて表示を切り替える

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

devise実装の続き

前回はdeviseの実装をしました

今回はログイン状態にあわせて画面表示を切り替えられるようにする

例)ログインしているときはユーザーアイコンを表示させて

ログインしていないときはユーザーアイコンを非表示にする


ログイン状態で表示を切り替える

ログインしていたら

今ログインしているなら、ユーザーアイコンを表示させる

app/views/layouts/application.html.hamlを開く

もしログインしていたらif user_signed_in?(表示する)というコードを書く

      - if user_signed_in?
        .dropdown
          = image_tag 'default-avatar.png', class: 'header_avater dropbtn'
          .dropdown-content
            %a{:href => "#"} プロフィール
            %a{:href => "#"} ログアウト

これに限らず、インデントがずれるとエラーが起きるので注意


ログアウトして表示を消す

今ログインしているなら、ログアウトもできるようにする

すでに作成済みのpathを使って、ログアウト機能を作る

destroy_user_session_path DELETE

→ userのsessionをdestroyしてログアウトする

application.html.hamlの「ログアウト」の部分を書き換える

  = link_to 'ログアウト', destroy_user_session_path, data: { method: 'delete' }

link_toはデフォルトでGETリクエストなので、methodはdeleteであると表記する


2024/9/28 追記

ログアウトはdeleteメソッドからgetメソッドになっているので注意!

助けていただいた記事です↓

(最終課題中、ここめちゃくちゃ苦戦しました・・)


ログインしていなかったら

今ログインしていないなら、ログインできるようにする

  1. ログインしているか「if user_signed_in?」で確認
  2. ログインしていないなら「else」で処理を続ける

↓ ログインボタンを表示させるので、「GET」リクエストの/sign_inを使う

application.html.hamlのif文の続きを書く

      - else
        = link_to 'ログイン', new_user_session_path, class: 'header_loginBtn'

link_toはデフォルトでGETリクエストなので、methodは記入不要


ログインしていなければ編集ボタンも消す

ログインしていないのに、記事の詳細画面で「編集する」「削除する」のドロップボタンが表示されるのはおかしい

articles/show.html.hamlif user_signed_in?を追加する

    - if user_signed_in?
      .article_detail_actions
        .dropdown
          = image_tag 'actions.svg', class: 'dropbtn'
          .dropdown-content.mini
            = link_to '編集する', edit_article_path(@article)
            = link_to '削除する', article_path(@article),               |
              data: { method: 'delete', confirm: '本当に削除してもいいですか?' } |

ログイン状態にあわせて行動を制限する

「ログインしていないと出来ないこと」をルール付ける

例)ログインしていないと、記事投稿できないようにする

これもdeviseが用意してくれているものを使う

authenticate_user!

authenticate_user! 

→ 「ログインしていないと使えません」という意味

app/controllers/article_controller.rbに以下を書く

class ArticlesController < ApplicationController
  before_action :authenticate_user!

すべてのアクションが、ログインしていないと使えませんというルールができる


onlyオプションで限定する

  • ログインしていなくても出来ること
  • ログインしていないと出来ないこと

これらを踏まえて、ログインしていないと許可できないものをonly:で追加する

  before_action :authenticate_user!,
  only: [:new, :create, :edit, :update, :destroy]

#DAY19