Edited at

【Rails】deviseを導入してみる


deviseとは

Rubyのgem(ライブラリ)の1つ。

ログイン機能の実装を簡単にしてくれるgem

今回私はFacebookAPIを使用したログインを実装するために使ってみた。


使ってみる

実際にdeviseを使用してログイン周りのページを作成していく


インストール

Gemfileに追記


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

今回自分は会員登録後のリダイレクト先をユーザのプロフィール画面に変更したかったので、以下のように修正。


app/controllers/users/registrations_controller.rb

# プロフィール画面用のアクションを追加

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


ログイン後のリダイレクト先もついでに変更してみる。


application_controller.rb

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に以下の記述を追加。


route.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を得ることができる。