【Ruby on Rails】deviseの導入から実装するまで


目標

deviseを導入し実行できるまで

開発環境

ruby '2.6.5'
rails '6.0.0'

実装

devise導入から、実装までの一連の流れ

deviseをインストール

Gemfile
gem 'devise'
ターミナル
% bundle install

% rails g devise:install

rails g deviseコマンドは、deviseによるユーザー機能の対象を指定することで、モデルとマイグレーションの生成やルーティングの設定などをまとめて処理します。

実行すると、モデルが生成され、routes.rbにはdeviseに関連するパスが追加されます。

Userモデルを作成

ターミナル
% rails g devise user

マイグレーションファイルを編集

class DeviseCreateUsers < ActiveRecord::Migration[6.0]
 def change
   create_table :users do |t|
     ## Database authenticatable
     t.string :email,              null: false, default: ""
     t.string :encrypted_password, null: false, default: ""
     t.string :name,               null: false

     # 省略

end

nameカラムを追加

ターミナル
% rails db:migrate

viewsを追加

ターミナル
% rails g devise:views

deviseに用意されたビューファイルをコピーし、app/viewsの配下に配置してくれるコマンドです。
HTMLを修正できるため、カスタマイズ可能になります。

viewsを編集

app/views/devise/sessions/new.html.erb
<div class="contents row">
  <div class="container">
    <h2>Log in</h2>
    <%= form_with model: @user, url: user_session_path, id: 'new_user', class: 'new_user', local: true do |f| %>

      <div class="field">
        <%= f.label :name %><br />
        <%= f.text_field :name%>
      </div>
      <div class="field">
        <%= f.label :email %><br />
        <%= f.email_field :email, autofocus: true %>
      </div>

      <div class="field">
        <%= f.label :password %><br />
        <%= f.password_field :password, autocomplete: "off" %>
      </div>

      <% if devise_mapping.rememberable? %>
        <div class="field">
          <%= f.label :remember_me %><br />
          <%= f.check_box :remember_me %>
        </div>
      <% end -%>

      <div class="actions">
        <%= f.submit "Log in" %>
      </div>
    <% end %>
  </div>
</div>

nameカラムの記入欄を追加

モデルにバリデーションを記入

app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :authenticate_user!
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end

application_controllerにbefore_actionを使用しているため、全てのアクションが実行される前に、実行されます。

before_action :authenticate_user!により、ログインしていないユーザーをログインページの画面に促すことができます。

configure_permitted_parametersで、configure_permitted_parametersメソッドを呼び出しています。

詳細
devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])