gem administrateを使ってみた

Categories
Tags
Share

仕事で新しいRailsプロジェクトを作った際に、管理画面を作るのに楽がしたかったので、 gemのAdministrateを使ってみました。

Administrate

こんな感じの画面を作ることができます(Modelが1つしかないので寂しいですが)

gem administrateでの管理画面

管理画面を作る用の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の組み合わせで、半日程度で一応管理画面が作れました。 次回は管理画面やフォームのカスタマイズについてチラッと紹介します。


comments powered by Disqus