後へ      Topへ      次へ

Devise: 各種設定

日本語対応

Devise を日本語対応にしておきます。
View で表示する文字列が日本語になります。

  1. bundle add devise-i18n
  2. bundle install

参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/79a1ce0

不使用機能の削除

本WEBアプリで使用しない機能を削除しておきます。
(不要な挙動でバグを出さないため)

\app\models\user.rb の  

devise :database_authenticatable, :registerable,
       :recoverable, :rememberable, :validatable

から :recoverable, :rememberable, を削除。

ちなみに、

参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/1c81720

コントローラ、ビューをローカルに生成

この後で変更するため、
Devise のコントローラ、ビュー部分のコードをローカルにコピーします。

  1. ruby bin/rails generate devise:views users
  2. ruby bin/rails generate devise:controllers users

Devise 自体をアップデートする際には、 ローカル側は手作業で追従する必要があるため注意してください。

参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/1aedbbb

registrations と sessions のローカル化

コントローラ、ビューをローカルに移管したため、
ルーティングもローカルに変更します。

\config\routes.rb の

devise_for :users

を

devise_for :users, controllers: {
  registrations: 'users/registrations',
  sessions: 'users/sessions'
}

に変更します。

参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/6146493

新規登録時の仕様変更

Devise のデフォルトでは、
ユーザー登録は、未ログイン時のみ&誰でも実行可能です。
本WEBアプリでは、admin で、かつログイン後でのみ可能に変更します。
(これは、ポリシーの問題なので、単なる一例とお考え下さい)

  1. ローカルにコピーした
    \app\controllers\users\registrations_controller.rb に、
    before_action :authenticate_user!
    を追加。

    before_action は Rails のメソッドで、
    該当コントローラの各アクションが実行される前に自動で呼ばれます。
    authenticate_user! は Devise のメソッドで、
    ログインしていなければログイン画面へリダイレクトするメソッドです。

  2. Devise がログイン済みユーザーを弾くコードが
    require_no_authentication にあるので、
    \app\controllers\users\registrations_controller.rb で上書きして、
    ユーザーがアドミンなら弾かないようにします。

  3. \views\layouts\application.html.erb は、
    全ての View 共通の定義です。
    ここにログインとログアウトへのリンクを追加します。

  4. ついでに、
    \config\routes.rb
    root を books の index に変更しておきます。

参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/59e773a

sign_up 時の入力項目を補完

本WEBアプリ独自に用意している users のカラムを、
Devise での sign_up 時にも設定できるように変更します。

\app\controllers\application_controller.rb は、
全コントローラ共通のコードを書く場所です。
Devise の devise_parameter_sanitizer.permit で
本WEBアプリ独自カラム (:enabled, :name, :is_admin, :is_librarian) も
Devise が受け入れるようにします。

実際のフォームは、
\app\views\users\registrations\new.html.erb
\app\views\users\registrations\edit.html.erb にあるので、
共に 独自カラム (:enabled, :name, :is_admin, :is_librarian) 用のコードを追加します。

参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/b00e512

Devise 独自カラムのケア

Devise 独自カラム email を、
本WEBアプリの View で編集できるようにします。

  1. \app\controllers\users_controller.rb
    params.expect は、編集対象のカラムを絞り込むコードなので、
    ここに :email を追加。

  2. \app\views\users\_form.html.erb はユーザー編集時の画面なので、
    ここに email 用の処理を追加。
    同 _user.html.erb はユーザー表示時の画面なので、同様に追加します。

参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/9628e00

未ログインのアクセス阻止

ログインしていないユーザーが、
WEB の中身にアクセスできないようにしておきます。

\app\controllers\application_controller.rb (全コントローラ共通コード) に、
before_action :authenticate_user! を追加します。

参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/53b3d4f

無効ユーザーのログイン阻止

無効化された (= enabled が false) ユーザーが、
ログインできないようにします。

\app\models\user.rb に以下を追記。

def active_for_authentication?
  super && enabled?
end

active_for_authentication? は認証OKかをチェックする Devise のメソッドで、
super (元コードの結果) と、
enabled カラムが true かを AND しています。

enabled? ですが、
モデルのカラム(今回は enabled)が boolean 型の時、
カラム名に ? を付けたメソッドを Rails が自動生成してくれます。
カラムの値は nil になる場合もありますが、
この ? 付きメソッドなら、常に boolean で返してくれるので安心です。
Rails のお約束として、true/false のみを返すメソッドは ? で終わる、もあります。

次に。
ログインできない時、デフォルトでは、
「アカウントが有効化されていません。メールに記載された手順にしたがって、アカウントを有効化してください。」
と表示されます。 本WEBアプリでは、メールでのアクティベーションには対応していないので、
\config\locales\devise.en.yml にて、
inactive の内容を上書きします。

リポジトリ的には、
https://github.com/Bonv-dev/book_mgmt/commit/8de9e95
に差分があります。

Devise のメソッドとメッセージを上書きしているので、
Devise がアップデートした際には注意が必要です。


後へ      Topへ      次へ