【Ruby on Rails】deviseでつまづいたところ

deviseを用いてユーザー認証を実装する際に躓いたポイントを素人目線でまとめてみた。

deviseとは🤔

deviseとはRuby on Railsで作成したアプリケーションに簡単にユーザー認証機能を実装することができるgemである。 github.com

前提

  • rails generate devise MODELrails generate devise usersで実行

deviseのインストールとセットアップ

READMEにインストール手順が記載されているので、基本的にその指示通りにインストールすればOK

  1. Gemfileにgem 'devise'を追加し、bundle installを実行
    ※READMEに記載のあるように、Rails 4.1以上からしか使用できないので注意が必要

    Devise 4.0 works with Rails 4.1 onwards. Add the following line to your Gemfile:

  2. rails generate devise:installを実行

  3. config/environments/development.rbに下記の行を追加
    config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

  4. userモデルを作成するため下記コマンドを実行

    rails g devise users
    rails db:migrate
    
  5. サーバーを起動した後、http://localhost:3000/users/sign_inにアクセスして、ユーザーが作成できるか確認してみる

deviseのViewとController

現在の各種ファイルを確認したところsign_inやsign_upで表示された画面に対応するViewファイルが見当たらない...
上記のセットアップの中でViewやControllerが一緒に作成されると思い込んでいたが、作成されなかったので作成する。

# Viewファイルの作成
rails g devise:views users
# Controllerファイルの作成
rails g devise:controllers users

ただし、このままでは作成されたViewやControllerをごにょごにょしても実際には反映されない。
config/routes.rbを変更する前だと、各種viewなどはgem自体のviewファイルなどを参照していることがログからわかる。

  Rendering /Users/choco/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/devise-4.8.1/app/views/devise/registrations/new.html.erb within layouts/application
  Rendered /Users/choco/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/devise-4.8.1/app/views/devise/shared/_error_messages.html.erb (Duration: 1.2ms | Allocations: 295)
  Rendered /Users/choco/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/devise-4.8.1/app/views/devise/shared/_links.html.erb (Duration: 1.5ms | Allocations: 617)
  Rendered /Users/choco/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/devise-4.8.1/app/views/devise/registrations/new.html.erb within layouts/application (Duration: 411.3ms | Allocations: 2799

config/routes.rbに記載されているdevise_for :usersを下記に置き換えることにより、app/views/users配下にある各種Viewを参照するようになる。
※ 下記の場合だとregistrationssessionsのみusers配下を参照するようになる (パスワード再設定ページなどはusers配下を参照しない)

  devise_for :users, controllers: {
    registrations: 'users/registrations',
    sessions: "users/sessions",
  }
  Rendering users/registrations/new.html.erb within layouts/application
  Rendered users/shared/_error_messages.html.erb (Duration: 1.4ms | Allocations: 289)
  Rendered users/shared/_links.html.erb (Duration: 2.0ms | Allocations: 611)
  Rendered users/registrations/new.html.erb within layouts/application (Duration: 327.1ms | Allocations: 279730)

全view、controllerをuser配下のものを参照させたいときは、config/initialize/devise.rbに記載されているconfig.scoped_views = falseconfig.scoped_views = tureに置き換えてあげるとよい。

参考サイト

github.com

zenn.dev

qiita.com