0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

地域防災サイトを作成する記録(第2回)

Posted at

今回実装する機能

ユーザー認証
目的:匿名での誤情報拡散を防ぐため、登録ユーザーのみが情報を投稿できるようにする。

1. Deviseのインストール

Gemfileに以下を追加してインストールします。

ruby
gem 'devise'

その後、以下のコマンドを実行します。

bash
bundle install
rails g devise:install

2 ユーザーモデルの作成

以下のコマンドでユーザーモデルを生成します。

bash
rails g devise User

生成された User モデルは、すでにログインや認証の仕組みが含まれています。
これにより、以下のファイルが作成されます:
app/models/user.rb
db/migrate/xxxxxx_devise_create_users.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

マイグレーションを実行します。

bash
rails db:migrate

3.ユーザー管理画面の設定

deviseが用意したビューをカスタマイズするために以下を実行します。

bash
rails g devise:views

生成されたapp/views/deviseディレクトリ内のファイルを編集して、フォームにnameaddressを追加します。

app/views/devise/registrations/new.html.erb
<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は特定のフィールドのみ編集可能です。追加フィールド(nameaddress)を許可するために、Strong Parametersを設定します。
app/controllers/application_controller.rbに以下を追加します。

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.管理者権限の追加

管理者フラグをモデルに追加します。

bash
rails g migration AddAdminToUsers admin:boolean

マイグレーションファイルを編集して、デフォルト値を設定します。

db/migrate/xxxxxx_add_admin_to_users.rb
class AddAdminToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :admin, :boolean, default: false
  end
end

マイグレーションを実行します。

bash
rails db:migrate

管理者だけが特定の操作を行えるようにコントローラに条件を追加します。

UsersController
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

以上で今回のユーザー認証の実装になります。

参考文献

こちらは古いめ記事になりますが、参考にしたので、記載させていただきます。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?