環境
Rubyバージョン: ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x64-mingw32]
Rails Gemバージョン: 6.1.4.1
devise Gemバージョン: 4.8.0
devise-i18n Gemバージョン: 1.10.0
ユーザモデル名: User
テンプレートエンジン: erb
参考になるサイト
英語読める&README読む能力がある方は正直公式見るのが一番早いと思います。
- https://github.com/heartcombo/devise/blob/c82e4cf47b02002b2fd7ca31d441cf1043fc634c/README.md
- https://github.com/tigrish/devise-i18n/blob/802be774c28beda1587333dd7b5c761c9b5f8107/README.md
この記事ではなにをする?
Deviseの導入
Gemfile編集
Gemfileの一番下に追記
gem 'devise'
Gemインストール
ターミナルでコマンド実行
bundle install
Devise用ファイル作成
ターミナルでコマンド実行
rails generate devise:install
DeviseのViewを編集できるようにする
※必要がない場合、もしくは後述する日本語化をする場合は不要
ターミナルでコマンド実行
rails generate devise:views
これによって、app/views/devise
の中にviewファイルが作成され、それを自由に編集することができます
Deviseで必要な設定を追加
※既に設定されている場合は不要
config/environments/development.rb
の一番下(endよりは上)に追記
ホスト名(host)、ポート(port)は場合によっては適当なものに置き換える
ここでのホスト名とポートはdevelopment環境のものです
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
rootルーティングを追加
※既に設定されている場合は不要
config/routes.rb
に追加(追加する場所は好きな場所でOK)
コントローラー名、アクション名は適当なものに置き換え
Rails.application.routes.draw do
# ~~~~~~~~~~
root 'home#index'
end
フラッシュメッセージを表示するようにする
※既に設定している場合は不要
app/views/layouts/application.html.erb
のbodyの中に追加
<% if flash[:notice] %>
<p>Notice: <%= flash[:notice] %></p>
<% end %>
<% if flash[:alert] %>
<p>Alert: <%= flash[:alert] %></p>
<% end %>
Devise用ユーザモデルを作成
ターミナルでコマンドを実行
この記事ではモデル名をUser
としていますが、任意の名前にすることができます(Member
など)
rails generate devise User
このとき、config/routes.rb
にdevise_for :users
が追加されていて、これによってdeviseで必要なすべてのルーティングが自動で追加されます(/users/sign_in
など)
Deviseの機能をカスタマイズ
以下は使用する場合だけ行います
複数の機能を使用することもできます
全機能共通モデル編集
app/models/user.rb
に使用したい機能を追加
使用したい機能全てをカンマ区切りで追加します
- devise :database_authenticatable, :registerable,
- :recoverable, :rememberable, :validatable
+ devise :database_authenticatable, :registerable,
+ :recoverable, :rememberable, :validatable, :confirmable, :foo, :bar
Trackable
ログイン履歴や状態が記録されるようになります
マイグレーション編集
db/migrate/xxxxxxxxxxxxxx_devise_create_users.rb
の一部コメントを解除
- ## Trackable
- # t.integer :sign_in_count, default: 0, null: false
- # t.datetime :current_sign_in_at
- # t.datetime :last_sign_in_at
- # t.string :current_sign_in_ip
- # t.string :last_sign_in_ip
+ ## Trackable
+ t.integer :sign_in_count, default: 0, null: false
+ t.datetime :current_sign_in_at
+ t.datetime :last_sign_in_at
+ t.string :current_sign_in_ip
+ t.string :last_sign_in_ip
Confirmable
新規登録時にメールアドレスの確認メールが送信されるようになります(よくあるやつ)
マイグレーション編集
db/migrate/xxxxxxxxxxxxxx_devise_create_users.rb
の一部コメントを解除
t.string :unconfirmed_email
は、メールアドレスを後から変更する場合に必要になります
- ## Confirmable
- # t.string :confirmation_token
- # t.datetime :confirmed_at
- # t.datetime :confirmation_sent_at
- # t.string :unconfirmed_email # Only if using reconfirmable
+ ## Confirmable
+ t.string :confirmation_token
+ t.datetime :confirmed_at
+ t.datetime :confirmation_sent_at
+ t.string :unconfirmed_email # Only if using reconfirmable
- # add_index :users, :confirmation_token, unique: true
+ add_index :users, :confirmation_token, unique: true
Lockable
一定回数ログインに失敗した場合アカウントを凍結します
通常、メールで本人確認することで解除されます
t.string :unlock_token
は、config.unlock_strategy
がemail
かboth
のときだけコメント解除します(デフォルトはboth)
マイグレーション編集
db/migrate/xxxxxxxxxxxxxx_devise_create_users.rb
の一部コメントを解除
- ## Lockable
- # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
- # t.string :unlock_token # Only if unlock strategy is :email or :both
- # t.datetime :locked_at
+ ## Lockable
+ t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
+ t.string :unlock_token # Only if unlock strategy is :email or :both
+ t.datetime :locked_at
- # add_index :users, :unlock_token, unique: true
+ add_index :users, :unlock_token, unique: true
Timeoutable
一定期間何も行われていないと自動でサインアウトさせる
※マイグレーションの編集はなし
マイグレーション
ターミナルでコマンド実行
rake db:migrate
各種リンクをViewに追加
app/views/layouts/application.html.erb
のbodyの中に追加
<ul>
<% if current_user %>
<li><%= current_user.email %>さん</li>
<li><%= link_to 'アカウント編集', edit_user_registration_path %></li>
<li><%= link_to 'ログアウト', destroy_user_session_path, method: :delete %></li>
<% else %>
<li><%= link_to 'アカウント登録', new_user_registration_path %></li>
<li><%= link_to 'ログイン', new_user_session_path %></li>
<% end %>
</ul>
動作確認
※Railsを再起動しておく
リンクやメッセージが正常に表示されていることを確認します
メールを使用する場合
development環境ではデフォルトでメールの送信内容はコンソールに表示されますが、流れてしまって見づらいのでletter_opener gemを使用するのがおすすめです(よくgmailを設定したりしますが、development環境でそれを行うのはあまり良くないと思います)
もしよければ5分でRailsにletter_opener gemを導入するもご覧ください
メールの送信元を変更する
デフォルトでは、メールの送信元がplease-change-me-at-config-initializers-devise@example.com
となっています(development環境ではこれでも特に問題ありません)が、config/initializers/devise.rb
を編集することでこれを変更することもできます。
※再起動必須
- config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'
+ config.mailer_sender = 'sukina_mail_address@example.com'
i18n(日本語)に対応させる
rails-i18nが導入されていない場合
[簡単] Rails6の標準メッセージを日本語に対応させる(i18n)を参考に導入する
Gemfile編集
Gemfileの一番下に追記
gem 'devise-i18n'
Gemインストール
ターミナルでコマンド実行
bundle install
動作確認
ブラウザでログイン画面などを開き、日本語化されていることを確認する
日本語化できていない場合もしくはViewを編集したい場合
すでにapp/views/devise
が存在する場合
viewをカスタマイズしていない場合か、変更箇所が少ない場合
app/views/devise
をディレクトリごと削除する
viewをかなりカスタマイズしている場合
こちらを参考に、すべてのメッセージをi18nの形(t('devise.confirmations.confirmed')
など)に置き換える
deviseのviewを作成する
ターミナルでコマンド実行
rails g devise:i18n:views
これで、app/views/devise
にi18n(日本語)に対応したviewが作成されます
それを自由に編集することができます
deviseのメッセージを編集したい場合
ロケールファイルを作成する
ターミナルでコマンド実行
rails g devise:i18n:locale ja
config/locales/devise.views.ja.yml
が作成されて、これを編集することができます