【Ruby on Rails】deviseでつまづいたところ
deviseを用いてユーザー認証を実装する際に躓いたポイントを素人目線でまとめてみた。
deviseとは🤔
deviseとはRuby on Railsで作成したアプリケーションに簡単にユーザー認証機能を実装することができるgemである。 github.com
前提
rails generate devise MODEL
はrails generate devise users
で実行
deviseのインストールとセットアップ
READMEにインストール手順が記載されているので、基本的にその指示通りにインストールすればOK
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:
rails generate devise:install
を実行config/environments/development.rb
に下記の行を追加
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
user
モデルを作成するため下記コマンドを実行rails g devise users rails db:migrate
サーバーを起動した後、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を参照するようになる。
※ 下記の場合だとregistrations
とsessions
のみ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 = false
をconfig.scoped_views = ture
に置き換えてあげるとよい。