🍎

Rails_adminで管理者機能作成

2023/06/11に公開

はじめに

ポートフォリオ作成中のプログラミング初学者です🔰
今回の1ヶ月もない限られた時間で、どうにか時間を短縮できないか?と考え
rails_adminで管理者機能を作成しました!

(deviseは導入済みです)

〜完成画面〜

環境

ruby 3.1.2p20
Rails 6.1.7.3

gemの導入(rails_admin)

Gemfile
gem 'rails_admin'
ターミナルで実行
$ bundle install
$ rails g rails_admin:install

名前空間を聞かれるので、/adminでよければ、Enterキーを押す。
⬇️
rails routesで/adminが生成されていることを確認。
サーバを再起動してから、/adminにアクセスする。
⬇️
これでもう既に形はできている!👀

gemの導入(cancancan編)

CanCanCan とは、権限管理 gem であり、特定のユーザーがアクセスできるリソースを制限します。

Gemfile
gem 'cancancan'
ターミナルで実行
$ bundle install

管理者権限の設定

  • cancancanでabilityを生成
$ rails g cancan:ability

コマンドを実行すると、権限を管理するファイルが作られます。

生成されたモデルを以下の様に変更

  • 管理者権限を持つユーザに管理画面へのアクセスと全てのモデルに対しての全ての操作(新規保存、編集、削除など)」を許可する設定です。
app/models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    if user.try(:admin?)
      can :access, :rails_admin
      can :manage, :all
    end
  end
end

if user.try(:admin?)
tryメソッドを使用し、userがnilであるか、admin?メソッドを持たないオブジェクトである場合、tryメソッドは何もしないでnilを返します。userがadmin?メソッドを持つオブジェクトである場合、そのメソッドが呼び出され、その結果が返されます。

つまり、ログインしている&admin?メソッドを持つユーザーは、rails_adminへのアクセス権限があり、全てのモデルのCRUDが行える状態になっています。

tryメソッドとは
  • オブジェクトがnilの時やメソッドが定義されていない場合はnilを返す
  • メソッドが定義されている場合はそのメソットを呼び出す

rails_admin.rbも以下のように変更

  • :end_userの部分は、Deviseで設定した認証のスコープ(例えば:userなど)に置き換えてください。
config/initializers/rails_admin.rb
RailsAdmin.config do |config|
  config.asset_source = :webpacker

  ### Popular gems integration

  ## == Devise ==
  config.authenticate_with do
    warden.authenticate! scope: :end_user
  end
  config.current_user_method(&:current_end_user)

  ## == CancanCan ==
  config.authorize_with :cancancan

  ## == Pundit ==
  # config.authorize_with :pundit

管理者権限の付与

deviseで登録したユーザに管理者権限を持たせます。

ユーザが管理者がどうかを判断する為に、「admin」カラムを追加し、ture or falseで判断出来るようにします。

ターミナルで実行
$ rails g migration AddAdminToEndUser admin:boolean

マイグレーションファイルが作成されるので、デフォルトをfalseにします。

migrationファイル
class AddAdminToEndUser < ActiveRecord::Migration[6.1]
  # default: falseを追加
  def change
    add_column :end_users, :admin, :boolean, default: false
  end
end

⬇️

$ rails db:migrate

これで元々あったend_userテーブルにadminカラムを追加できました。

  • 管理者権限をつけたいユーザーのadminカラムをtrueにします。
ターミナルで実行
$ rails c
> end_user = EndUser.find(1)
> end_user.update_attribute(:admin, true)

今回の場合は、1番目のユーザに管理者権限を付与しました。
このユーザは管理画面に遷移することができます。

管理者画面へのリンク作成

localhost:3000/adminなど
root pathの後に/adminをつけると管理画面に遷移できます!

フッターに以下のように記載して管理者画面へのリンクを作成しておきました。

app/views/layouts/_footer.html.erb
  <% if current_end_user.try(:admin?) %>
    <%= link_to '管理者ログイン', rails_admin_path %>
  <% end %>

rails_adminの日本語化

gemをインストールしていない場合はしてください!

gem 'rails-i18n'

⬇️

$ bundle install

デフォルトの言語を日本語に設定
追加する場所に注意!
class Application < Rails::Applicationの中に記述

config/application.rb
:
class Application < Rails::Application
  config.i18n.default_locale = :ja # ここを追記
:

ymlに日本語の設定をする

  • config/locales配下にrails_admin.ja.ymlファイルを作成
    ⬇️
    こちらの翻訳をコピーし、貼り付けます。
    ⬇️
    上記の内容だけだと、モデルやカラム名が英語のままだったので、
    別途下記のように追記しました!

各自のモデル名、カラム名、日本語変換を記載してください!

model全体に対応させるときはmodelsの階層を作り、
カラム名を対応させるときはattributesの階層を作ります⭐️(インデント要注意です!)

config/locals/rails_admin.ja.yml
ja:
  activerecord:
  # 全てのモデル記載
    models:
      end_user: ユーザー
      admin: 管理者
      post_blog: ブログ投稿
      post_meal: 食事投稿
      post_workout: フィットネス投稿
:
    attributes:
     # 各モデルのカラム名を記載
      end_user:
        user_name: ユーザー名
        height: 身長
        body_weight: 体重
        introduction: 自己紹介
        email: メールアドレス
        password: パスワード
      admin:
        email: メールアドレス
        password: パスワード
:

管理者画面できちんと日本語になっているか確認してみてください!

参考にさせていただいた記事🌱

https://qiita.com/mailok1212/items/8e36a5a10f19023bb0c4

https://qiita.com/nakachan1994/items/d5357d10dd6fd132fa92

https://blog.nightonly.com/2020/05/16/railsアプリにサクッとrailsadminを導入/

さいごに

以上の流れで管理者機能が完成できるはずです!

管理画面系gemには、rails_adminの他にもadminstateactive_adminがあるみたいです!

それぞれの比較についての記事🌱
https://qiita.com/baban/items/f751fb05c4d2367878aa

カスタマイズ方法🌱
https://qiita.com/joker1007/items/4ac31f081c44634a5e90

それぞれの特徴やデメリット、将来性を加味した上でgemを選ばないといけませんね!

間違いや抜けているところなどあれば、ぜひコメントなどで教えていただけますと幸いです🥹

Discussion