箱のプログラミング日記。

えんじにあ奮闘記

railsで管理者権限を付与したい【rails_admin】

f:id:y_hakoiri:20191102121842j:plain

Railsで商品予約サイトを作成しています。

ユーザー機能はdeviseで実装し、権限によってできる処理を分けたかったので

adminを使用しました。

 

主に使用するモデルとしては

  • product(商品)
  • user(顧客)
  • order(注文)

といった感じです。

 

今回、通常ユーザーはorderのnewとcreateのみ

管理者専用ユーザーは商品の追加や削除、全ユーザーの注文一覧表示など

全ての処理ができるようにします。

 

 

adminの導入

 

usersテーブルにadminカラムを追加

 

  • マイグレーションファイルを作成します

$ rails g migration AddAdminToUsers

 

  • 出来上がったマイグレーションファイルを編集
class AddAdminToUsers < ActiveRecord::Migration[5.2]
 def change
  add_column :users, :admin, :boolean, default: false
 end
end
 
boolean型はtrueかfalseを返します
default: falseとしておくことで、新規ユーザーがcreateされた場合の初期値はfalseにしておきます
 
この時実際にDBに保存される値は
true = 1, false = 0 になります。
 
 
管理者専用アカウントの作成

deviseで通常通り新規アカウントを作成します

adminが0(false)になっていることを確認したら、コンソールでadminの値を変更します

 

$ rails c

[1] pry(main)> user = User.find(1)  //idが1のレコードを取得(今作成したuserのid)

[2] pry(main)> user.admin = true

[3] pry(main)> user.save

 

すると今作成したユーザーのadminがtrueになり管理者権限が付与されます。

もちろん新しく作成せずに、既にあるユーザーに権限をつけてもOK

 

あとはコントローラーやビューで

adminがtrue の場合とfailseの場合で分岐して、各処理を書いていけばOK

 

ですがいちいち分岐の処理を書くのは面倒なので

付与されている権限によってできる処理をあらかじめ決めておくことができる

便利なプラグインがあります

 

 

cancancan

なかなか特徴的な名前(笑)

管理者権限を簡単に定義しておくことのできるgemです

 

gem 'cancancan'

$ bundle install

$ rails g cancancan:ability

 

すると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?)でそのユーザーが管理者権限を持っているかを検証しています

ここのuserはモデル名なので、適宜変更してください

user.tryとなっているのはuserがnillだった場合(ログインしていなかった場合)にエラーになるのを防ぐためにこのようにしていますが、

 

通常、userに管理者権限があるかどうかを検証するには

user.admin?だけで大丈夫です。

 

今回、私は通常ユーザーと管理者ユーザーだけでシンプルでしたが、

ユーザーの権限が何段階かに分かれる場合や

コントローラーやアクションごとに細かく権限を分けたい場合などは、

以下の記事が詳しく載っていたので参考にしてください

qiita.com

 

rails-adminの導入

先ほど「管理者専用ページへのアクセス」とありましたが、ここからが一番便利な部分です

今回のように全ての権限を管理者に対して与えられる場合、

通常コンソールで行うべきDBへのデータの追加、削除、一覧表示など

アプリケーションの管理に必要な機能をブラウザ上でできるとても便利なツールがあります

 

gem 'rails-admin'

$ bundle install

$ rails g rails_admin:install

 

ここでnamespace?の入力を求められる場合もあるそうですが、私の場合はなかったのでこのまま進みます(/adminとルーティングがかぶった場合に必要らしい)

 

f:id:y_hakoiri:20190729165436p:plain

 

?  Where do you want to mount rails_admin? Press <enter> for [admin] >

となったので、Enterするとrouteとconfigファイルが生成されました。

 

$ rails s (サーバーを再起動)

 

管理者専用ページへのアクセス

rails_adminがインストールできたので、早速管理者専用ページに行ってみます

localhost:3000にアクセスし、末尾に/adminと入力するだけで飛べます

 

写真撮るの忘れましたが、このままだとまだ英語表記で「日本語への翻訳ができていません」みたいな表示がされると思います

ですがこの段階では画面自体が確認できればOKです

 

日本語に翻訳する

railsで何かを日本語に変換したい時はja.ymlファイルを作成し、そこに書いていけばいいですね

今回私はrails_admin専用のymlファイルを作成しました。

 

  • config/locals直下にrails_admin.ja.ymlを作成

 

中身の記述は、だいたいgithubでテンプレートが用意されていることが多いので引っ張ってきます。

  • 以下から丸ごとコピー

https://gist.github.com/mshibuya/1662352

githubにアクセスして

右上の方にある「Download ZIP」を押せばローカルに落とせます。

 

あとはFinderのダウンロードを開き(Macの場合)

Tabキーでタブを2つ開いたら、

片方のタブは今ダウンロードしてきた翻訳ファイル

もう片方のタブは今自分が作成しているアプリから、config/localsまで開いておき

ドラッグアンドドロップで移すだけです。

 

こういう、プログラミング以外のPCの操作の仕方みたいなものが分からず

イライラしたことが何度かありました。笑

「これをインストールします」「ダウンロードします」しか解説していない記事が多くて、

それをどうやってやるんだ!みたいなことを一度は感じたことのある人が少なくないはず。笑

 

作成した日本語化のファイルを読み込ませるためにはもう少しやることがあります

gem 'rails-i18n'

$ bundle install

 

config/apprication.rbに以下を記述

config.i18n.default_locale = :ja

class Application < Rails::Application

と記述があるはずなので、そのクラスの中に貼り付けてください。

 

 

これでやっと日本語化ができました。

もう一度localhost:3000/adminにアクセスしてみると、日本語で表示がされているはずです

 

f:id:y_hakoiri:20190729171642p:plain

左側にテーブル一覧が表示されていて

右端の+を押すと新しいレコードが追加できたりします

 

ちなみにこの状態でもモデル名とかは英語のままになっているので

これも日本語にしたい場合は先ほどコピーしてきたja.ymlを改良して、

それぞれのモデル名を日本語にしてあげれば良いかと思います。

 

 

以下参考

whatsupguys.net