Help us understand the problem. What is going on with this article?

【Rails】deviseを用いた名前ログイン機能の実装

目標

ezgif.com-video-to-gif.gif

開発環境

・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

前提

下記実装済み。

Slim導入

ログイン機能を実装

1. アプリケーションを作成

ターミナル
$ rails new devise_name

2. トップ画面を作成

ターミナル
$ cd devise_name
ターミナル
$ rails g controller homes top
routes.rb
Rails.application.routes.draw do
  root 'homes#top'
end
homes_controller.rb
class HomesController < ApplicationController
  def top
  end
end
top.html.slim
h1
  | トップ画面

3. deviseを導入

Gemfile
gem 'devise' 
ターミナル
$ bundle
ターミナル
$ rails g devise:install
ターミナル
$ rails g devise User name:string # モデル作成
ターミナル
$ rails db:migrate
ターミナル
$ rails g devise:controllers users # コントローラー作成
ターミナル
$ rails g devise:views users # ビュー作成
ターミナル
$ bundle exec erb2slim app/views app/views -d # ビューをslimに変換し、erbを削除

名前ログイン機能を実装

1. ルーティングの編集

routes.rb
Rails.application.routes.draw do
  root 'homes#top'

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

devise_for :コントローラー名, controllers: {
sessions: 'コントローラー名/sessions',
registrations: 'コントローラー名/registrations'
}

上記の様に記述する事でViewの変更が可能になる。
「devise_for :users」のままでは、既存のViewが表示されてしまい、Viewの編集が効かなくなる。

2. サインアップ画面に名前入力フォームを追記

users/registrations/new.html.slim
.field
  = f.label :name
  br
  = f.text_field :name, autofocus: true, autocomplete: "name"

.field
  = f.label :email
  br
  = f.email_field :email, autofocus: true, autocomplete: "email"

3. サインイン画面を編集

users/sessions/new.html.slim
/ メール入力フォームを削除し、名前入力フォームを追記
.field
  = f.label :name
  br
  = f.text_field :name, autofocus: true, autocomplete: "name"

4. 「application_controller.rb」を編集

application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller? 

  private

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

4. 「devise.rb」を編集

config/initializers/devise.rb
#43行目をコメントアウトして[:name]に変更
config.authentication_keys = [:name]

4. 「application.html.erb」を編集

application.html.slim
body
  - if user_signed_in?
    = link_to "ログアウト", destroy_user_session_path, method: :delete
  - else
    = link_to "新規登録", new_user_registration_path
    = link_to "ログイン", new_user_session_path

  = yield

※ サインアップ 、ログイン後はdeviseの初期設定で「root」(homes#top)に飛ぶ

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away