#deviseとは
Rubyのgem(ライブラリ)の1つ。
ログイン機能の実装を簡単にしてくれるgem
今回私はFacebookAPIを使用したログインを実装するために使ってみた。
#使ってみる
実際にdeviseを使用してログイン周りのページを作成していく
インストール
Gemfileに追記
gem 'devise'
bundle install実行
$ bundle install
依存するファイルも一緒に作成
$ rails g devise:install
Usersモデルを作成
$ rails g devise user
マイグレーションファイルを見てみると、
emailとパスワード用のカラムは自動で生成されるようになっているので、
他に追加したいものがあればここでマイグレーションファイルに追記。
マイグレーションを実行。
$ rake db:migrate
ここまででとりあえずhttp://localhost:3000/users/sign_inを開くと
最低限のログインページは完成する。
しかし、ビューなどをカスタマイズしたい場合は加えて次項以降の作業も必要。
deviseに対応したビューの作成
コマンドで一発
$ rails g devise:views users
ビューをカスタマイズしたい場合はここで生成されたファイルを編集すれば良い。
deviseに対応したコントローラの作成
同様にターミナルでコマンドを実行
$ rails g devise:controllers users
今回自分は会員登録後のリダイレクト先をユーザのプロフィール画面に変更したかったので、以下のように修正。
# プロフィール画面用のアクションを追加
def detail
@user = User.find_by(id: params[:id])
end
# protected
# ここのコメントアウトを外してリダイレクト先を指定
# ルートパス名でも良い
# The path used after sign up.
def after_sign_up_path_for(resource)
"/user/#{current_user.id}"
end
ログイン後のリダイレクト先もついでに変更してみる。
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
# このアクションを追加
def after_sign_in_path_for(resource)
"/user/#{current_user.id}"
end
protected
# 入力フォームからアカウント名情報をDBに保存するために追加
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
end
end
ルーティングの編集
routes.rbに以下の記述を追加。
devise_for :users, :controllers => {
:registrations => 'users/registrations',
:sessions => 'users/sessions'
}
devise_scope :user do
get "user/:id", :to => "users/registrations#detail"
get "signup", :to => "users/registrations#new"
get "login", :to => "users/sessions#new"
get "logout", :to => "users/sessions#destroy"
end
ビューファイルと対応するページ
ファイルパス | 機能 |
---|---|
sessions/new.html.erb | ログイン画面 |
registrations/new.html.erb | ユーザ登録画面 |
registrations/edit.html.erb | プロフィール情報変更画面 |
passwords/new.html.erb | メール送信画面(パスワード変更用) |
passwords/edit.html.erb | パスワード変更画面 |
confirmations/new.html.erb | メールによる認証を行う画面 |
unlocks/new.html.erb | アカウントのアンロック画面 |
加えて
ログインユーザのIDは、
current_user.id で取得することができる。
また、ユーザがログイン済みかどうかは、
user_signed_in? によってtrueかfalseを得ることができる。