今回はプロゲートの上級2章、「deviseを活用しよう」をやっていきます。
ログイン必須ページをつくる
class NotesController < ApplicationController # 未ログイン時は本コントローラー内のすべてのアクションにアクセスできなくなる。 before_action :authenticate_user! ・ ・ end
制限されたアクションにアクセスするとログイン画面にリダイレクトされる。
フラッシュによるメッセージを表示する
noticeとwarningにより、成功と失敗のメッセージを生成できる。
application.html.erb
・ ・ <div class="container"> <p> <%= notice %> </p> <p> <$= warning %> </p> </div> ・ ・
ログイン後にヘッダーの表示を切り替える
「user_sign_in?」ヘルパーによりユーザーログイン有無を確認可能
application.html.erb
<ul class="header-right"> ・ ・ <% if user_signed_in? %> <li>ログインしています</li> <% end %> </ul> ・ ・
deviseのルーティング
route.rbに「devise_for :users」を挿入することでルーティングを自動生成している。
routes.rb
Rails.application.routes.draw do devise_for :users ・ ・ end
deviseの主なルーティング
Title | Prefix | Verb | URI Pattern | Controler#Action |
---|---|---|---|---|
ログイン画面 | new_user_session | GET | /users/sign_in | devise/session#index |
ログアウト | destroy_user_session | DELETE | /users/sign_out | devise/session#destroy |
ユーザー登録画面 | new_user_registration | GET | /users/sign_up | devise/session#new |
ログインしているユーザーのオブジェクトを取得する
deviseが用意しているcurrent_userの属性値を取得してみる。
<%= current_user.id %> #=> 1 <%= current_user.email %> # =>sho@prog-8.com
deviseの処理を見てみよう
パスワードの仕組み
パスワードの保存:userテーブルのencrypted_passwordカラムに暗号化して保存
ログイン認証:emailが一致するuserを取得、そのuserのencrypted_passwordが入力パスワードの暗号化したものが一致するかで判定
deviseをカスタマイズしてみよう
userモデルにおいてemail,passwordに加えてnameを編集できるようにカスタマイズする。
カスタマイズ用のviewファイルを作成
デフォルトのviewを用いる場合はdeviseのviewを意識する必要はない。
# 新規登録viewとログインviewを生成
$ rais g devise:views -v registrations sessions
フォームにnameを追加
registrations/new.html.erb
<% form_for ... do |f| %> ・ ・ <%= f.text_field :name %> ・ ・ <% end %>
nameを保存できるようにする
devise絡みのコントローラーの場合、configure_permitted_parametersを呼び、nameの保存を許可する。
application_controller.rb
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? ・ ・ private configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) << :name end end
deviseとコントローラを使い分けよう
deviseの新規登録画面とscaffoldで作成した新規登録画面が存在するが、
devise側の画面のみを今後は用いる。
user.rbより new,create,destroyを削除する。
削除したアクションへのアクセスを制限するためにルーティングを修正する。
create, new, destroyへのアクセスを制限する。
routes.rb
Rails.application.routes.draw do ・ ・ resource :users, only: [:index, :show, :edit, :update] ・ ・ end