4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Ruby on Rails】deviseを使ってログイン機能を実装 (新規登録時に名前を入力できるようにする)

Last updated at Posted at 2020-06-05

##実装の流れ(まとめ)
1, deviceを導入

2, deviseの設定ファイルを作成

3, deviseの機能を持ったUserモデルを作成

4, マイグレーションファイルにnameカラムを追加する記述

5, 作成されたマイグレーションファイルを実行

6, devise用のビューを作成

7, 新規登録画面で名前を入力できるようにフォーム欄を追加

8, ストロングパラメーターを追加

9, 未ログイン時・ログイン時でボタンの表示を変更

10, 完了

詳細を以下に記載します。

##1, deviceを導入
gemファイルの一番下に以下を記述します。

Gemfile
gem 'devise' 

##2, deviseの設定ファイルを作成

deviseを使用するためには、Gemのインストールに加えてdevise専用のコマンドを利用して設定ファイルを作成する必要があります。
ターミナルにて以下を実行します。

ターミナル
$ rails g devise:install

実行後以下のファイルが作成されます。
config/initializers/devise.rb
config/locales/devise.en.yml

##3, deviseの機能を持ったUserモデルを作成

作成には通常のモデルの作成方法ではなく、deviseのモデルの作成用コマンドでUserモデルを作成します。
ターミナルにて以下を実行します。

ターミナル
$ rails g devise user

実行後以下のファイルが作成されます。
app/models/user.rb
db/migrate/20XXXXXXXXXXXX_devise_create_users.rb
test/fixtures/users.yml
test/models/user_test.rb

またconfig/routes.rbに以下の様な記述が自動的に追記されることで、ログイン・新規登録で必要なルーティングが生成されます。

config/routes.rb
Rails.application.routes.draw do
  devise_for :users
#以下略

##4, マイグレーションファイルにnameカラムを追加する記述

t.string :name, null: false
を追記します。

db/migrate/20XXXXXXXXXXXX_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      ## Database authenticatable
#ここから追記します
      t.string :name,               null: false
#ここまで追記します
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
#以下略

##5, 作成されたマイグレーションファイルを実行

ターミナル
$ rails db:migrate

##6, devise用のビューを作成
deviseのコマンドを利用してビューファイルを生成すると、簡単に新規登録画面とログイン画面を作成できます。

ターミナル
$ rails g devise:views

##7, 新規登録画面で名前を入力できるようにフォーム欄を追加
新規登録画面を編集して名前を入力できるようにフォーム欄を追記します。

app/views/devise/registrations/new.html.haml
%h2 Sign up
= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f|
  = render "devise/shared/error_messages", resource: resource
#ここから追記します
  .field
    = f.label :name
    %br/
    = f.text_field :name
#ここまで追記します
  .field
    = f.label :email
    %br/
    = f.email_field :email, autofocus: true, autocomplete: "email"
  .field
    = f.label :password
    - if @minimum_password_length
      %em
        (#{@minimum_password_length} characters minimum)
    %br/
    = f.password_field :password, autocomplete: "new-password"
  .field
    = f.label :password_confirmation
    %br/
    = f.password_field :password_confirmation, autocomplete: "new-password"
  .actions
    = f.submit "Sign up"
= render "devise/shared/links"

##8, ストロングパラメーターを追加
名前が入力できるようになりましたが、このままでは名前はDBに保存されません。
何故ならdeviseでは初期状態で新規登録時にメールアドレスとパスワードのみを受け取るようにストロングパラメーターが設定してあるからです。
そこで configure_permitted_parametersメソッド を利用します。
このメソッドはdeviseのストロングパラメーターを追加できるメソッドです。

application_controllerに以下を追記します。

controllers/application_controller
class ApplicationController < ActionController::Base

  # ここから追記します
  before_action :configure_permitted_parameters, if: :devise_controller?

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name]) # 新規登録時(sign_up時)にnameというキーのパラメーターを追加で許可する
  end
  # ここまで追記します
end

##9, 未ログイン時・ログイン時でボタンの表示を変更
deviseでログイン機能を実装すると、user_signed_in?というメソッドを使用することができます。
これは、ユーザーがサインインしているかどうか検証するメソッドです。
サインインしている場合にはtrueを返し、サインインしていない場合にはfalseを返します。
ボタンを追加したい任意のファイルに以下を記述します。

- if user_signed_in?
  = link_to "新規投稿", new_post_path, class: "header__right--btn"
  = link_to "ログアウト", destroy_user_session_path, method: :delete, class: "header__right--btn"
- else
  = link_to "ログイン", new_user_session_path, class: "header__right--btn"
  = link_to "新規登録", new_user_registration_path, class: "header__right--btn"

##10, 完了
あとはビューを整えれば完成です。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?