読者です 読者をやめる 読者になる 読者になる

気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Rails プロゲートの上級2章(deviseを活用しよう)

今回はプロゲートの上級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