Rails_adminで管理者機能作成
はじめに
ポートフォリオ作成中のプログラミング初学者です🔰
今回の1ヶ月もない限られた時間で、どうにか時間を短縮できないか?と考え
rails_adminで管理者機能を作成しました!
(deviseは導入済みです)
〜完成画面〜
環境
ruby 3.1.2p20
Rails 6.1.7.3
gemの導入(rails_admin)
gem 'rails_admin'
$ bundle install
$ rails g rails_admin:install
名前空間を聞かれるので、/adminでよければ、Enterキーを押す。
⬇️
rails routesで/adminが生成されていることを確認。
サーバを再起動してから、/adminにアクセスする。
⬇️
これでもう既に形はできている!👀
gemの導入(cancancan編)
CanCanCan とは、権限管理 gem であり、特定のユーザーがアクセスできるリソースを制限します。
gem 'cancancan'
$ bundle install
管理者権限の設定
- cancancanでabilityを生成
$ rails g cancan:ability
コマンドを実行すると、権限を管理するファイルが作られます。
生成されたモデルを以下の様に変更
- 管理者権限を持つユーザに管理画面へのアクセスと全てのモデルに対しての全ての操作(新規保存、編集、削除など)」を許可する設定です。
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など)に置き換えてください。
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にします。
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をつけると管理画面に遷移できます!
フッターに以下のように記載して管理者画面へのリンクを作成しておきました。
<% if current_end_user.try(:admin?) %>
<%= link_to '管理者ログイン', rails_admin_path %>
<% end %>
rails_adminの日本語化
gemをインストールしていない場合はしてください!
gem 'rails-i18n'
⬇️
$ bundle install
デフォルトの言語を日本語に設定
追加する場所に注意!
class Application < Rails::Application
の中に記述
:
class Application < Rails::Application
config.i18n.default_locale = :ja # ここを追記
:
ymlに日本語の設定をする
- config/locales配下にrails_admin.ja.ymlファイルを作成
⬇️
こちらの翻訳をコピーし、貼り付けます。
⬇️
上記の内容だけだと、モデルやカラム名が英語のままだったので、
別途下記のように追記しました!
各自のモデル名、カラム名、日本語変換を記載してください!
model全体に対応させるときはmodelsの階層を作り、
カラム名を対応させるときはattributesの階層を作ります⭐️(インデント要注意です!)
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: パスワード
:
管理者画面できちんと日本語になっているか確認してみてください!
参考にさせていただいた記事🌱
さいごに
以上の流れで管理者機能が完成できるはずです!
管理画面系gemには、rails_adminの他にもadminstateやactive_adminがあるみたいです!
それぞれの比較についての記事🌱
カスタマイズ方法🌱
それぞれの特徴やデメリット、将来性を加味した上でgemを選ばないといけませんね!
間違いや抜けているところなどあれば、ぜひコメントなどで教えていただけますと幸いです🥹
Discussion