※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。
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であると表記する
ログアウトはdeleteメソッドからgetメソッドになっているので注意!
助けていただいた記事です↓
(最終課題中、ここめちゃくちゃ苦戦しました・・)
今ログインしていないなら、ログインできるようにする
- ログインしているか「
if user_signed_in?
」で確認 - ログインしていないなら「
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.hamlにif 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!
→ 「ログインしていないと使えません」という意味
app/controllers/article_controller.rbに以下を書く
class ArticlesController < ApplicationController
before_action :authenticate_user!
すべてのアクションが、ログインしていないと使えませんというルールができる
- ログインしていなくても出来ること
- ログインしていないと出来ないこと
これらを踏まえて、ログインしていないと許可できないものをonly:
で追加する
before_action :authenticate_user!,
only: [:new, :create, :edit, :update, :destroy]
#DAY19