RailsTutorialを一通りした後Deviseを導入したアプリを作ることになったので
その時、便利に感じたこと、よく使うなと感じたことをまとめておこうと思います。
ちなみに全てのDeviseの機能を使用しているわけではないです。
動作環境
ruby , 2.5.1
rails , 5.1.6
Devise , 4.4
下記公式のGithubページ
Deviseとは
deviseはログイン認証機能を提供するgemです。
rails generate ~ するだけでログイン・ログアウト、新規ユーザの作成、削除、バリデーション等
昨今の Webサイトであるようなログイン機能をすばやく実装できます。
Deviseで使えるようになるヘルパーメソッド
Deviseで生成されたControllerとViewの内部で以下のメソッドが使えるようになります。
メソッド | 機能 |
---|---|
before_action :authenticate_user! | ログイン済ユーザーのみにアクセスを許可 |
user_signed_in? | ユーザーがサインイン済かどうかを判定する |
current_user | サインインしているユーザーを取得 |
user_session | ユーザーのセッション情報にアクセスする |
※モデル名がUser以外の場合、「user」部分を書き換える必要があります。
before_action :authenticate_user! の使い方
ログイン済でないとアクセスして欲しくないアクションに設定します。
デフォルトでログインしていない場合はログイン画面に遷移する仕様になっていますので
カスタマイズしたい場合はコントローラのリダイレクトを上書きしなければなりません。
class SampleController < ApplicationController
before_action :authenticate_user!, only: [:show]
def index
end
def show
end
end
user_signed_in?の使い方
View等でログイン済みのユーザにのみ表示させる等特定のユーザ毎に表示させるオブジェクトを分けたい時に使えます。
例ではログイン済みの場合のみログアウトボタンが表示されます。
<%= link_to "ログアウト", destroy_user_session_path, class: "btn" if user_signed_in? %>
current_userの使い方
サインインしているユーザーとそのIDを取得して
例ではプロフィールをクリックすると、サインインしているユーザ個別のページを表示させるようなことができます。
<%= link_to "プロフィール", user_path(current_user.id) %>
※user_sessionについては私は使用したことがないです。
RSpecでDeviseのヘルパーメソッドを使かってみる
sign_in、sign_outのメソッドを使うことでユーザのログイン、ログアウトの状態を変更することできます。
まずは、rails_helperにDeviseのテストヘルパーをロードさせます。
RSpec.configure do |config|
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
config.fixture_path = "#{::Rails.root}/spec/fixtures"
#
# Rspec既存のコード
#
# Deviseのテストヘルパーを読み込ませる
config.include Devise::TestHelpers, :type => :controller
例ではControllerテストに記述。
require 'rails_helper'
RSpec.describe SamplesController, type: :controller do
describe "#show" do
#ユーザを生成
before do
user = FactoryBot.create(:user)
#作ったユーザでログイン
sidn_in user
end
# 正常にレスポンスを返すこと
it "responds successfully" do
get :show, params: {id: user.id}
expect(response).to be_successful
end
end
end
初めて使ってみた感想
「なんかよくわからんけど、ログイン機能ができてる」みたいな印象。
そのため初心者からだと公式ドキュメント読んで仕様を理解するのが大変だと思います。
Deviseは便利ですが、こればっか使ってるとセッションや暗号化のやり方を忘れるので
Ruby on Rails Tutorialなんかで復習しないとなと思いました。