🗿

【Rails】Devise導入チュートリアル

2022/05/30に公開

はじめに

今回、accountというモデルを作り、deviseを導入しました。
実際のアプリではuserモデルを作り認証機能を実装することが多いと思うので、
その時は「account」を「user」に各々変更して、開発を進めてください。

初期設定

gem ‘devise’ 

上記ををGemfileに記述後、

$ bundle install

$ rails g devise:install

完了。

Devise用モデル作成

$rails g devise account

accountはデバイス用のモデルの作成 accountという名前で
Devise用のモデル作ったということ。

上記コマンドはモデルを作ったことだから、

$rails db:migrate

を実行する。

コントローラーを作成する

$rails g controller page index login_check

(Indexはログイン前ページ、ログインページ、サインインなどで必要になるためのコントローラー)

今回実装したコード

上記 「コントローラーを作成する」で以下のコントローラーを作成。
作成したコントローラーに対応するviewファイルも作成。

app/controllers/pages_controller.rb

class PagesController < ApplicationController
  layout 'application'
  before_action :authenticate_account!, only: :login_check
  
  def index
    @msg = 'this is sample page.'
  end

  def home
  end

  def login_check
    @account = current_account #Deviseで設定したモデルのインスタンス(コマンドで出来上がった物
    
    @msg = 'account created at: ' + @account.created_at.to_s
  end
end

app/views/pages/index.html.erb

<h1 class="display-4 text-primary">Hello#index</h1>
<p><%= @msg %></p>
<hr>
<div><%= link_to "login_check page!", action: "login_check" %></div>
<div><%= link_to "Sign out", destroy_account_session_path, method: :delete %></div>

ログイン周りの動作の解説

/Pages/index.html.erbはログイン状態か否かを確認するページ。

カーソル部分が/pagesのリンク先になっているとわかる。

http://localhost:3000/rails/info/routes

/pagesのURIはpagesコントローラーのlogin_checkアクションに通じるとわかる。

(記述内容はログインページとログアウトのリンクをlink_toで作成のみ)
ログインページのリンク、そのログインページ(login_checkアクション指定 link_toのもの)はpagesコントローラーのlogin_checkアクションに通じるので、/pagesがログインページのURIになる。(before_actionでログインしてるかチェックされ、login_check.html.erbにはどっちの結果でもURIは同じだが表示される結果が違う。ログインページかlogin_checkのメアド表示する内容)
ログイン前ページ(indexアクション)からログインページのリンク(indexログイン前ページのlink_toのもの)押すと、ログインページに。(link_toがlogin_checkアクションに通じてて、login_checkアクションはlogin_check.html.erbに通じるから)
→新規登録しなきゃログインできないのでログインページにあるサインアップ(新規登録)を押す

ログインチェックアクションはログインしてるかどうかを表示するためのページ
ログインしてなければログインページに、してればこのメアドでログインしてるよー的な表示がされる
これはlogin_checkコントローラのbefore_actionでログインしているか否かのチェックがアクション実行前に行われている。フィルターのようなもの。ログインしてるか否かを判断している。

before_action :authenticate_account!, only: :login_check
authenticate_モデル名!

↑これはdeviseで用意されているメソッド 
ログインしてなければログイン画面にリダイレクトしている
この処理がどのページでもされてたら強制ログインページ行きになるから、
login_checkアクションにonly: で指定している。(login_check.html.erbのURIを叩いた時)

ログインページのURI
Localhost:3000/コントローラー(accounts)←デバイスのモデル/sign_up

ログアウト周り

method: delete のオプションが指定されているので削除される。DELETE PATCHが適用されるから。
URI直接アクセスしてもログアウトはできない。

/pages(.:format) pages#login_check

ログインしてない状態でアクセスするとログインページに、(ログインしていないから)
URIは/pages(login_checkアクション)
(新規登録はaccounts/sign_upデバイス用のモデル)
ログインしたら/pagesに(URI変わらない)
この状態でログインのページにいくと(/accounts/sign_up)
ログインしてますよとトップページにレンダリングされる。

/pagesに行くとログインしてる画面になる(ただデバイス用の処理かlogin_checkアクションの処理か変わるだけ)
デバイス用のaccountsコントローラー

デバイスのコントローラーの記述見れない?
ログインしている状態でログインページアクセスした時のコントローラーの記述が気になる deviseはどう書いているのかどんな記述しているからログインしてますーの挙動になるのか
→Githubにあがっている。
https://github.com/heartcombo/devise/blob/main/app/controllers/devise_controller.rb

ビューページは見れる(app/views/devise/sessions/new.html.erb)

view周り

$ rails g devise:views

上記コマンドでデバイスので利用されるテンプレートビューファイルが作成される。
ログイン画面等認証周りのビューページが追加されるので必要に合わせて編集し、見た目を整える。

ログイン周りの実装完了。

参考、引用:
 掌田 津耶乃(2020) 著. Ruby on Rails 6 超入門 秀和システム

Discussion