Railsで商品予約サイトを作成しています。
ユーザー機能はdeviseで実装し、権限によってできる処理を分けたかったので
adminを使用しました。
主に使用するモデルとしては
- product(商品)
- user(顧客)
- order(注文)
といった感じです。
今回、通常ユーザーはorderのnewとcreateのみ
管理者専用ユーザーは商品の追加や削除、全ユーザーの注文一覧表示など
全ての処理ができるようにします。
adminの導入
usersテーブルにadminカラムを追加
- マイグレーションファイルを作成します
$ rails g migration AddAdminToUsers
- 出来上がったマイグレーションファイルを編集
管理者専用アカウントの作成
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というモデルファイルが生成されるので、
ここに権限ごとにできることを書いておきます
if user.try(:admin?)でそのユーザーが管理者権限を持っているかを検証しています
ここのuserはモデル名なので、適宜変更してください
user.tryとなっているのはuserがnillだった場合(ログインしていなかった場合)にエラーになるのを防ぐためにこのようにしていますが、
通常、userに管理者権限があるかどうかを検証するには
user.admin?だけで大丈夫です。
今回、私は通常ユーザーと管理者ユーザーだけでシンプルでしたが、
ユーザーの権限が何段階かに分かれる場合や
コントローラーやアクションごとに細かく権限を分けたい場合などは、
以下の記事が詳しく載っていたので参考にしてください
rails-adminの導入
先ほど「管理者専用ページへのアクセス」とありましたが、ここからが一番便利な部分です
今回のように全ての権限を管理者に対して与えられる場合、
通常コンソールで行うべきDBへのデータの追加、削除、一覧表示など
アプリケーションの管理に必要な機能をブラウザ上でできるとても便利なツールがあります
gem 'rails-admin'
$ bundle install
$ rails g rails_admin:install
ここでnamespace?の入力を求められる場合もあるそうですが、私の場合はなかったのでこのまま進みます(/adminとルーティングがかぶった場合に必要らしい)
? 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に以下を記述
class Application < Rails::Application
と記述があるはずなので、そのクラスの中に貼り付けてください。
これでやっと日本語化ができました。
もう一度localhost:3000/adminにアクセスしてみると、日本語で表示がされているはずです
左側にテーブル一覧が表示されていて
右端の+を押すと新しいレコードが追加できたりします
ちなみにこの状態でもモデル名とかは英語のままになっているので
これも日本語にしたい場合は先ほどコピーしてきたja.ymlを改良して、
それぞれのモデル名を日本語にしてあげれば良いかと思います。
以下参考