ユーザー管理機能の実装方法

 Ruby on Railsで作成しているアプリケーションでユーザー管理機能を実装する方法を紹介したいと思います。deviseというgemライブラリを用いて実装していきます。

 

 流れは以下の通りです。

1. deviseの導入

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

3. deviseのユーザーモデルを作成

4. テーブルの作成

5. deviseのビューファイルの作成

6. 後でカラムを追加する場合

7. ストロングパラメーターの使用

8. その他

 

1. deviseの導入

 まずはdeviseをインストールします。Gemfileの最後の行にdeviseの記述を加えて、ターミナルでbundle installをしましょう。

Gemfile

gem 'devise'

ターミナル

% bundle install

 

 

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

 deviseを使用するために、devise専用のコマンドで設定ファイルを作成しましょう。

ターミナル

% rails g devise:install

 

3. deviseのユーザーモデルを作成

 ユーザー情報を管理するためのモデルを作成しましょう。

ターミナル

% rails g devise user

 

4. テーブルの作成

 nicknameなどの追加したいカラムがある場合は、マイグレーションファイルに追記しましょう。

db/migrate/20xxxxxxxxx_devise_create_users.rb

t.string :nickname,           null: false
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""

 テーブル設計が確認できたらマイグレーションを実行しましょう。

ターミナル

% rails db:migrate

 

5. deviseのビューファイルの作成

 deviseのビューファイルを生成しましょう。カラムを追加している場合はビューファイルを編集しましょう。

ターミナル

% rails g devise:views

 

6. 後でカラムを追加する場合

 もし後になってマイグレーションファイルに新しくカラムを追加したくなった場合は下記のコマンドを実行しましょう。firstnameカラムを追加するなら下記のようになります。

% rails g migration AddFirstnameToUsers firstname:string

 rails db:rollbackをした後にカラムを追記して再度rails db:migrateを実行する方法もあります。

 

7. ストロングパラメーターの使用

 deviseの処理を行うコントローラーはGem内に記述されているため、編集することができません。そのため、すべてのコントローラーが継承しているファイルであるapplication_controller.rbファイルにストロングパラメーターを定義することで、処理を読み込ませます。deviseが提供しているdevise_parameter_sanitizerメソッドを使って、追加したカラムの処理を許可させましょう。

app/controllers/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: [:nickname, :firstname])
end
end

 

 以上でユーザー管理機能の実装は完了です。

 

 

 8. その他

 ユーザー管理機能の実装時に使える記述をいくつか紹介します。

 下記のメソッドは未ログインユーザーをログインページに転送させます。

controller

 
  before_action :authenticate_user!
 

 

 未ログインユーザーを特定のページにアクセスできないようにしたいときは、下記のような記述ができます。リダイレクトという仕組みを使ってトップページに遷移させることができます。

controller

 
before_action :move_to_index, except: [:index, :show, :search]
 
def move_to_index
unless user_signed_in?
redirect_to action: :index
end
end

 

 ログインの有無で処理を変えたい場合は下記の記述をします。

view

 
<% if user_signed_in? %>
処理を記述
<% end %>
 

 

 

以上です!