こんにちは。
Railsでadmin(管理)ページを作る際、多くの方がgemを使うと思います。
active_admin, rails_admin, administrateなどのgemが有名です。
ただ、今回欲しいadminの機能は非常にシンプルなものでした。
・単純に登録ユーザーの一覧を日付順で見たい
というものだけです。
ただそれだけのためにgemを導入するのもどうかなあと思ったので、非常にシンプルですが練習も兼ねて簡易的なadminページを自分で作ってみました。
どのような流れで作るか
まず全体の流れを説明します。
1, userにadministratorというカラムを追加
2, seedファイルを使ってadministratorユーザーの作成
3, routesにadministrator用のルートを追加
4, administrator用のコントローラーの作成
5, administrator用のviewを作成
以上が超簡易的なadminページの作成の流れです。
ただし、すでにuser関連の機能(認証機能など)はすでに実装されているものとします。
1, userにadministratorカラムを追加
管理ページは、もちろん全ての人が見られるわけではありません。
管理者以外の人は見ることができないようにする必要があります。
なので、ユーザーが管理者であるのかどうかを判定するために、Userにboolean型のadministratorというカラムを追加します。
このadministratorカラムにtrueが入っているユーザーが管理者です。逆にいうと、管理者以外のユーザーは全てfalseである必要があります。
なので、このカラムを作成する場合にはdefault値としてfalseを指定しておきましょう。
1 |
rails g migration add_administrator_to_users admin:boolean |
このコマンドでによって以下のようなマイグレーションファイルが作成されます。
1 2 3 4 5 |
class AddAdministratorToUsers < ActiveRecord::Migration[5.1] def change add_column :users, :administrator, :boolean end end |
このままだとdefault値が設定されないので、それを付け加えます。
1 2 3 4 5 |
class AddAdministratorToUsers < ActiveRecord::Migration[5.1] def change add_column :users, :administrator, :boolean, default: false end end |
『default: false』の部分を追加しました。
ではマイグレーションを実行しましょう。
1 |
rails db:migrate |
これでadministratorというカラムが追加されました!!
2, seedファイルを使ってadministratorユーザーの作成
続いてadministratorユーザーを先に作ってしまいましょう。seedファイルを使って作成します。
本来であれば開発環境のseedファイルと本番環境のseedファイルを分けたほうがいいかもしれませんが、今回は説明を省くため両方とも同じファイルで作っていきます。
1 2 3 4 5 |
User.create!(name: "yourname", email: ENV['EMAIL'], password: ENV['PASSWORD'], password_confirmation: ENV['PASSWORD'] , administrator: true) |
なお、ここで指定しているnameやemailなどのカラムはそれぞれのアプリケーションで異なっているはずなので、自分のアプリケーションに合ったものを指定してください。
大事なのは、administratorをtrueにしている点です。これでこのユーザーが管理者として登録されます。
また、念のため環境変数を使ってメールアドレスとパスワードを設定しています。
seedファイルを作っただけではまだadministratorユーザーは作成されていません。以下のコマンドを実行しましょう。
1 |
rails db:seed |
これでadministratorユーザーが作成されました!!
本番環境でも同様にrails db:seedを実行してadministratorユーザーを作成しましょう。
上記のseedファイルで設定したメールアドレスとパスワードを使ってログインすることで、管理者としてログインすることができるようになります。
(今のところ他に何も作っていないので管理者としてログインしても意味がありませんが 笑)
3, administrator用のルートを作成
続いてadministrator用のルートを作成しましょう。
名前等は自分で決めてしまって大丈夫です。
1 2 3 4 5 6 7 8 9 |
Rails.application.routes.draw do namespace :administrator do resources :users, only: [:index] end #以下省略 end |
これによって、
/administrator/usersというルートが新たに追加されます。
その際に使われるコントローラーはadministrator/usersコントローラーで、今回の場合だとアクションはindexアクションです。
このルートで表示する予定のページはすなわち、サイト上の全てのユーザーを閲覧するためのページです。
(もしあなたがサイト上のpostをadministratorとして確認したければ、usersではなくpostsを追加してください。)
(また、only: [:index]の部分ももちろん自分の用途に合わせて変更してください。)
では続いてコントローラーを追加していきましょう!
4, コントローラー作成
先ほどのルートの追加によって、administrator/usersというコントローラーが必要となりましたのでそれを作成していきます。
1 |
rails g controller administrator/users |
これを実行することで、そのコントローラーが作成されます。
作成されたコントローラーにindexアクションを追加しましょう。
1 2 3 4 5 6 |
class Administrator::UsersController < ApplicationController #これは不完全なコード def index @users = User.all.order(created_at: :desc) end end |
ただし、これだと誰でもadministartorページにアクセスできてしまいます。
administratorのみがアクセスできるようにコードを変更しましょう。
ただし、current_userというメソッドがすでに追加されていることとします。
1 2 3 4 5 6 7 8 9 10 11 12 |
class Administrator::UsersController < ApplicationController before_action :admin_user def index @users = User.all.order(created_at: :desc) end private def admin_user redirect_to(root_url) unless current_user.administrator? end end |
admin_userというメソッドでは、現在のユーザーのadministratorカラムがtrueかどうかを確認しています。
これがfalseの場合はトップページにリダイレクトされるという仕組みです。
before_action :admin_userの追加も忘れないようにしてください。
(ただ、adminページを色々増やしていく際には、admin_userというメソッドを色々なところで使いまわすことになると思うので、その際にはapplication_controller等に移しましょう。)
これでadministrator以外の人がこのindexページに飛ぶことはできなくなりました!
最後にそのindexページのviewを簡易的に作ります。
5, admin用のviewを作成
ここでは特段変わったことはしません。
views/administrator/usersにindexページを追加するだけです。
今回はユーザーの一覧を日付順に見れるようにするだけなので非常にシンプルです。
(ちなみにcontrollerの部分ですでに@usersにはuserが日付順で新しいものから入っています)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<h1>登録済みのユーザー一覧</h1> <table class="table"> <thead> <tr> <th>id</th> <th>名前</th> <th>登録日</th> </tr> </thead> <tbody> <% @users.each do |user| %> <tr> <td><%= user.id %></td> <td><%= user.name %></td> <td><%= user.created_at %></td> </tr> <% end %> </tbody> </table> |
ここではbootstrapを使ってcssを当てています。class="table"はそのためです。
これで完成です!!
通常のログインページからseedファイルで設定したメールアドレスとパスワードを使ってログインし、/administrator/usersのページにアクセスしてみましょう!
今回のものは非常に単純でしたが、これを応用すればちゃんとしたadminページも比較的簡単に作成できます。
(時間があったらちゃんとしたadminページを作ってその作り方をまたシェアします。)
おまけ users_controllerのstrongパラメーターの設定の確認
Railsでは、ユーザーから受け取るパラメーターに制限をかけるという仕組みが備わっています。
何でもかんでもパラメーターを受け取ってしまっていては、簡単にdbが書き換えられてしまいます。
もし悪意あるユーザーがadministrator=trueというパラメーターを投げかけてきた場合、それを通してしまうとそのユーザーも管理者となれてしまいます。
そのような行為を未然に防ぐのがstrongパラメーターの役割です。
自分のusers_controllerを確認し、administratorがpermitされていないかを確認してください。
(というより、何も手をつけていなければpermitされていることはないので大丈夫です。#ただしRails4以降に限る)
以上でRailsでgemを使わずに、簡易的なadminページを作る方法の解説を終わります!