Ruby
Rails

[Ruby on Rails] devise name(名前)でログイン


はじめに

deviseでログイン機能を作成するときに名前とパスワードでログイン機能を作成したい方向けに記事を書きます。

基本的にコピペのみで完成します。

コードを理解してください。


環境


  • macOS mojave

  • rbenv 1.1.1

  • ruby 2.5.3

  • Rails 5.2.3


実装


email, passwordで新規登録、ログインする機能の作成

$ rails new devise_name

$ cd devise_name
$ rails g controller home top after_login


config/routes.rb

  Rails.application.routes.draw do

root 'home#top'
get 'home/after_login'
end


Gemfile

  ...追記

gem 'devise'

$ bundle

$ rails g devise:install
$ rails g devise User
$ rails db:migrate


app/views/home/top.html.erb

  <%= link_to '新規登録', new_user_registration_path %>

<%= link_to 'ログイン', new_user_session_path %>


app/controllers/application_controller.rb

  class ApplicationController < ActionController::Base

def after_sign_in_path_for(resource)
home_after_login_path
end
end



app/views/home/after_login.html.erb

  <%= link_to "ログアウト", destroy_user_session_path, method: :delete %>



name, email, passwordで新規登録、name, passwordでログインする機能の作成


  1. nameカラムの作成 & emailのバリデーション系を全て外す

$ rails g migration AddNameToUsers name:string

$ rails g migration ChangeColumnToUsers
$ rails g migration remove_index_email_from_users


db/migrate/日時_change_column_to_users.rb

  class ChangeColumnToUsers < ActiveRecord::Migration[5.2]

# 変更内容
def up
change_column :users, :email, :string, null: true, default: ""
end

# 変更前の状態
def down
change_column :users, :email, :string, null: false, default: ""
end
end



db/migrate/日時_remove_index_email_from_users.rb

  class RemoveIndexEmailFromUsers < ActiveRecord::Migration[5.2]

def change
remove_index :users, column: :email, unique: true
end
end

$ rails db:migrate


config/initializers/devise.rb

  ...編集

config.authentication_keys = [:name]


app/models/user.rb

  ...追記

def email_required?
false
end
def email_changed?
false
end


  1. 新規登録フォーム, ログインフォームの編集

$ rails g devise:views


app/views/devise/registrations/new.html.erb

  ...追記

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


app/views/devise/sessions/new.html.erb

  ...編集

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


  1. パラメータの許可


app/controllers/application_controller.rb

  class ApplicationController < ActionController::Base

before_action :configure_permitted_parameters, if: :devise_controller?

def after_sign_in_path_for(resource)
home_after_login_path
end

protected

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


以上。


完成コード

devise_name