はじめに
Ruby on RailsのGemであるdeviseの導入方法について紹介します。
私自身プログラミングを初めて半年程の初心者の為、不備等あるかも知れませんが、最後までご覧頂けたら嬉しいです。
それでは早速始めていきましょう!
deviseとは
RubyのGem(ライブラリ)の1つ。
User管理機能を簡単に実装するためのGem。
実際に運用されている多くのRailsアプリケーションで使用されている。
deviseインストール
Gemfileに追記
# 最後の行
gem 'devise'
Gemfile記述後、ターミナルでGemのインストールをおこなう。
※カレントディレクトリが作業ディレクトリになっていること
% bundle install
設定フォイルも一緒に作成
deviseを使用するためには、Gemのインストールに加え、 devise専用のコマンドで設定ファイルを作成する必要がある。
※現時点では、Gem(devise)をインストールしたら、最初に1度実行しておく程度の認識で問題ありません。
% rails g devise:install
Userモデルを作成
deviseのモデル作成用コマンドでUserモデルを作成
rails g deviseコマンドは、deviseによるユーザー機能の対象を指定することで、モデルとマイグレーションの生成やルーティングの設定などをまとめておこなってくれる。
% rails g devise user
実行すると、モデルが生成され、routes.rbにはdeviseに関連するパスが追加される。
テーブルを作成
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
def change
create_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
# 追加カラム
t.string :nickname, null: false
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
# 省略
t.timestamps null: false
end
add_index :users, :email, unique: true
add_index :users, :reset_password_token, unique: true
# add_index :users, :confirmation_token, unique: true
# add_index :users, :unlock_token, unique: true
end
end
マイグレーションファイルを見てみると、
emailとパスワード用のカラムは自動で生成されるようになっているので、
他に追加したいものがあればここでマイグレーションファイルに追記する。
(今回はnicknameカラムを追加する)
マイグレーションを実行
% rails db:migrate
ここまででusersテーブルが作成できました。
deviseのビュー作成
現時点でdeviseのログイン/サインアップ画面が自動的に生成されるがビューファイルとしては生成されない。
これは、deviseのGem内に存在するビューファイルを読み込んでいるため。
deviseのビューファイルに変更を加えるためには、deviseのコマンドを利用して、ビューファイルを生成する必要がある。
% rails g devise:views
これで、deviseに用意されたビューファイルをコピーし、app/viewsの配下に作成できる。
ビューをカスタマイズしたい場合は、ここで生成されたファイルを編集すれば良い。
今回はニックネームカラムを追加した為、サインアップ画面にニックネーム入力欄を追加する。
<h2>Sign up</h2>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
# 省略
<div class="field">
<%= f.label :nickname %><br />
<%= f.text_field :nickname, autofocus: true %>
</div>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email %>
</div>
# 省略
<% end %>
<%= render "devise/shared/links" %>
コントローラの編集
サインアップ時にUser情報を受け取れるようにする。
deviseの処理を行うコントローラーはGem内に記述されているため、編集することができない。
application_controller.rbに記載する。
このフォイルに記述することで、全てのコントローラーに継承される。
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
private
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
end
end
上記のコード説明
if: :devise_controller?
deviseに関するコントローラーの処理であれば、そのときだけconfigure_permitted_parametersメソッドを実行するように設定している。
:devise_controller?とは、deviseのヘルパーメソッド。
configure_permitted_parameters
deviseの提供元では、新たに定義するメソッド名をconfigure_permitted_parametersと紹介していることから、慣習的にこのメソッド名で定義することが多い。
あくまで慣習なので定義するメソッド名は自由。
devise_parameter_sanitizer
deviseにおけるparamsのようなメソッド。deviseのUserモデルに関わる「ログイン」「新規登録」などのリクエストからパラメーターを取得できる。
permit(:sign_up, keys: [:nickname])
deviseに定義されているpermitメソッドであり、Railsではじめから使用できたpermitメソッドとは異なるもの。
第一引数にdeviseの処理名、第二引数にkeysというキーに対し、配列でキーを指定することで、許可するパラメーターを追加する。
devise_parameter_sanitizerメソッドとpermitメソッドを組み合わせることにより、deviseに定義されているストロングパラメーターに対し、自分で新しく追加した(今回ならnickname)カラムも指定して含めることができる。
おまけ
deviseでよく使うメソッドを紹介します。
user_signed_in?
Userがログイン済みかtrueかfalseを得ることができる。
最後に
今回は私がRuby on Railsを始めて一番最初に難しいと思った実装について紹介しました。
どうしても分からなかったり、間違い箇所がありましたら、質問を頂ければと思います。
Twitterアカウント: https://twitter.com/DeguchiRyo0527
最後までご覧頂きありがとうございます。