Devise を日本語対応にしておきます。
View で表示する文字列が日本語になります。
参考リポジトリ: 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 のコントローラ、ビュー部分のコードをローカルにコピーします。
Devise 自体をアップデートする際には、 ローカル側は手作業で追従する必要があるため注意してください。
参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/1aedbbb
コントローラ、ビューをローカルに移管したため、
ルーティングもローカルに変更します。
\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 で、かつログイン後でのみ可能に変更します。
(これは、ポリシーの問題なので、単なる一例とお考え下さい)
ローカルにコピーした
\app\controllers\users\registrations_controller.rb に、
before_action :authenticate_user!
を追加。
before_action は Rails のメソッドで、
該当コントローラの各アクションが実行される前に自動で呼ばれます。
authenticate_user! は Devise のメソッドで、
ログインしていなければログイン画面へリダイレクトするメソッドです。
Devise がログイン済みユーザーを弾くコードが
require_no_authentication にあるので、
\app\controllers\users\registrations_controller.rb で上書きして、
ユーザーがアドミンなら弾かないようにします。
\views\layouts\application.html.erb は、
全ての View 共通の定義です。
ここにログインとログアウトへのリンクを追加します。
ついでに、
\config\routes.rb で
root を books の index に変更しておきます。
参考リポジトリ: https://github.com/Bonv-dev/book_mgmt/commit/59e773a
本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 独自カラム email を、
本WEBアプリの View で編集できるようにします。
\app\controllers\users_controller.rb の
params.expect は、編集対象のカラムを絞り込むコードなので、
ここに :email を追加。
\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 がアップデートした際には注意が必要です。