今回実装する機能
ユーザー認証
目的:匿名での誤情報拡散を防ぐため、登録ユーザーのみが情報を投稿できるようにする。
1. Deviseのインストール
Gemfileに以下を追加してインストールします。
gem 'devise'
その後、以下のコマンドを実行します。
bundle install
rails g devise:install
2 ユーザーモデルの作成
以下のコマンドでユーザーモデルを生成します。
rails g devise User
生成された User
モデルは、すでにログインや認証の仕組みが含まれています。
これにより、以下のファイルが作成されます:
・app/models/user.rb
・db/migrate/xxxxxx_devise_create_users.rb
マイグレーションファイルを編集して、名前と住所フィールドを追加します。
class DeviseCreateUsers < ActiveRecord::Migration[6.1]
def change
create_table :users do |t|
# Devise標準のカラム
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
# 追加するカラム
t.string :name, null: false
t.string :address, null: false
t.timestamps null: false
end
add_index :users, :email, unique: true
end
end
マイグレーションを実行します。
rails db:migrate
3.ユーザー管理画面の設定
devise
が用意したビューをカスタマイズするために以下を実行します。
rails g devise:views
生成されたapp/views/devise
ディレクトリ内のファイルを編集して、フォームにname
とaddress
を追加します。
<div class="field">
<%= f.label :name %>
<%= f.text_field :name, autofocus: true, required: true %>
</div>
<div class="field">
<%= f.label :address %>
<%= f.text_area :address, required: true %>
</div>
4.ユーザー情報編集機能
デフォルトでは、Devise
は特定のフィールドのみ編集可能です。追加フィールド(name
やaddress
)を許可するために、Strong Parametersを設定します。
app/controllers/application_controller.rb
に以下を追加します。
class ApplicationController < ActionController::Base
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :address])
devise_parameter_sanitizer.permit(:account_update, keys: [:name, :address])
end
end
5.管理者権限の追加
管理者フラグをモデルに追加します。
rails g migration AddAdminToUsers admin:boolean
マイグレーションファイルを編集して、デフォルト値を設定します。
class AddAdminToUsers < ActiveRecord::Migration[6.1]
def change
add_column :users, :admin, :boolean, default: false
end
end
マイグレーションを実行します。
rails db:migrate
管理者だけが特定の操作を行えるようにコントローラに条件を追加します。
class UsersController < ApplicationController
before_action :authenticate_user!
before_action :admin_only, only: [:destroy]
def index
@users = User.all
end
def destroy
@user = User.find(params[:id])
@user.destroy
redirect_to users_path
end
private
def admin_only
redirect_to root_path, alert: "権限がありません" unless current_user.admin?
end
end
以上で今回のユーザー認証の実装になります。
参考文献
こちらは古いめ記事になりますが、参考にしたので、記載させていただきます。