gem administrateを使ってみた
仕事で新しいRailsプロジェクトを作った際に、管理画面を作るのに楽がしたかったので、 gemのAdministrateを使ってみました。
こんな感じの画面を作ることができます(Modelが1つしかないので寂しいですが)
管理画面を作る用のgemはActiveAdminなどもあるのですが、 実際に画面を見せてもらい、使用感の話を聞いたのですが
- ActiveAdmin用のDSLを覚えるのが面倒(らしい)
- カスタマイズがしづらい(らしい)
ということでした。
そういう中で、administrateというgemがあるらしいと話を聞きました。 デモ画面を見たら、モダンな感じで、かつDSLを使わずに機能追加もRailsの流儀でできるということだったので、 そちらを使ってみることに。
ただし、administrateはメジャーバージョンをリリースしていないので、機能もまだまだだし、大きく変わるかも…ということです。
利用できるようにするまで
インストール
まずはGemfileに以下を追加しましょう。
gem "administrate", '~> 0.2'
gem "administrate-field-image" # administrate 0.2だと、これがないとエラーで落ちる
そして、bundle install
してください。
ファイルを生成
gemのインストール後、以下を実行して、ファイルを生成します。
rails generate administrate:install
実行すると、app/controllers
以下に、admin
ディレクトリとapplication_controller.rb
が作られます。
Modelが既にある場合はそれらのデータ用のcontrollerが追加で作られます。
また、app/dashboards
ディレクトリが作られます。
Modelが既にある場合はそれらのデータ用のdashboardが追加で作られます。
また、administrate用のroutesがconfig/routes.rb
に追加されます。
namespace :admin do
resources :users
root to: "users#index"
end
admin
というnamespaceが自動で追加されました。
アクセスしてみる
bin/rails s
して、 http://localhost:3000/admin にアクセスするとadministrateの画面が表示されます。
めっちゃ簡単に導入終わり。導入終わりなんですが、このままだと入れただけで何もしてません。
Deviseと連携してみる
さきほどの状態だと、管理画面にも関わらず、何にも制限がないので誰でも見られる状態です。それではいけません。 そこで、Deviseを使って認証済のユーザーのみ見られるようにしてみましょう。
Deviseを使えるようにする
Deviseのインストールをしていない人はしておきましょう。既に使っている人は読み飛ばしてください。 Gemfileに以下を追加します。
gem 'devise'
そして、bundle install
しましょう。
その後、以下を行います。
bin/rails g devise User
Deviseのカスタマイズをする場合は適当にしてもらうとして、今回は何もしません。DBをマイグレートしましょう。
bin/rake db:migrate
ユーザー追加
このままだとユーザーがいないのでログインできないので、仮のユーザーをdb/seeds.rb
に書いておきましょう。
User.create!(email: 'dummy1@example.com', password: 'password')
では、登録しておきましょう。
bin/rake db:seed
ログインしてみる
http://localhost:3000/users/sign_in にアクセスして、フォームに先ほどの情報を入力してログインを試みます。 ログインが成功したら、トップページにリダイレクトされると思います。
ログイン後のリダイレクト先を/admin
に
では、ログインのリダイレクト先を変更してみましょう。
app/controllers/application_controller.rb
を更新します。
after_sign_in_path_for
メソッドを定義して、リダイレクト先を定義します。
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
def after_sign_in_path_for(resource)
admin_root_path
end
end
この状態で再度ログインを行うと、http://localhost:3000/admin にリダイレクトされるようになりました。
とはいえ、まだ誰でも見られる状態になっているので、いよいよDevise経由の認証済みユーザーのみアクセスできるようにしましょう。
認証ユーザーのみ閲覧可能にする
app/controllers/admin/application_controller.rb
を編集します。
authenticate_admin
メソッド内で、認証条件を書くだけです。ここでは、Deviseの認証ユーザーかどうかを確認するauthenticate_user!
メソッドを呼びます。
module Admin
class ApplicationController < Administrate::ApplicationController
before_action :authenticate_admin
def authenticate_admin
authenticate_user!
end
end
end
ここまで行って保存すると、ログインしていない状態で http://localhost:3000/admin にアクセスすると、弾かれるようになりました。
まとめと次回
administrateとdeviseの組み合わせで、半日程度で一応管理画面が作れました。 次回は管理画面やフォームのカスタマイズについてチラッと紹介します。