Rails
rails_admin
active_admin
typus
administrate

rails管理画面系gem比較してみた

みなさん。railsで管理画面を作成するときはどうしているでしょうか?

正直な所、ログインや管理者のユーザー管理など、案件をまたいで共通の機能が多いので、便利なgemの力を借りる事が出来るなら、その方が楽ですよね

railsには、管理画面系3大gemとして、次のものが挙げられます


  1. rails_admin

  2. active_admin

  3. Administrate

これに含めて、typusがありますが、これはここ3年更新がされなくなってRails5の時代には追随出来ていないので候補から除いて、最後にgemを使わないで自分で一から開発するという選択肢もあります。

これも悪い選択肢ではありません。

…だけれども、実際どれを選べばいいのか迷いますよね

なので、どれから試していけばいいのか絞り込むその '入り口' として、それぞれの利点と欠点を紹介させていただきます

先に結論から出させていただくと、こんな感じが分かりやすいです

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f31303731352f30373432376334662d343339342d636230652d366535612d6538386464323463656431302e706e67.jpg


  1. rails_adminは最初から何でもやってくれるけどカスタマイズが辛い(一応できる)。開発者以外に使われようとすると苦労が伴う。

  2. Administrateはカスタマイズは何でもできるけど、3つのgemの中で一番小難しい

  3. active_adminはその中間、関係者が増えて、複雑な権限管理や細かいviewのカスタマイズが出始めると辛い

簡単に言うとこれだけなのですが、この意味がわかりやすい様に

実際のカスタマイズのポイントの解説も含めてさせていただきます

参考までにGithub上の⭐︎の数(2019年2月3日時点)も出させてもらいます


rails_admin

https://github.com/sferik/rails_admin

星の数:6983


特徴

rails_adminのデモサイトを見ればその魅力は一撃ですが

何より最初の見た目に関しては、rails_adminが一番強力です

http://rails-admin-tb.herokuapp.com/

初期設定の段階で、すべてのモデルを自動認識して、画像のアップロードやhas_manyなどの関連を見ての自動解析もやってくれます。

何もしなくても、基本的なインストール作業だけで綺麗な管理画面が出てくるのであまり解説するところがないのですが

細かいカスタマイズの方法に関しては下の記事がおすすめです

rails_adminをカスタマイズする方法まとめ


欠点

ただ、その逆として初期導入段階ではrails_adminは一番強力なのですが、細かいカスタマイズに一番弱いのがこのツールの欠点です。

「カスタマイズ出来るようで出来ない」という一言がこのツールを表す最も特徴的な言葉でしょう。

なので、開発者がちょっとデータを突っ込むツールとしてはいいが、運用を行うためのツールとしては十分な教育が必要な画面しか基本作れないことを覚悟してカスタマイズするのが基本方針かなというの個人的感想です。

実運用時には必ず細かいカスタマイズ要求が出てきますが、こういう細かいviewの修正をしたいときは、rails_adminには地獄という言葉がついて回ります。

出来ないわけでは無いが細かいカスタマイズはお勧めしないという感じです。

理由は、カスタマイズのための設定ファイルに大きなところがあります。

設定ファイルが

config/initilizers/rails_admin.rb

つまり「config/initilizers/」以下にあるため、何か書き換えるたびにrailsの再起動が必要になります。一行修正してみては、rails再起動の連続は、正直かなり苦痛でした

あと、コントローラー周りのカスタマイズなどが一つのファイルに集まるため、すぐに複雑なコードが出来上がります。

具体的な所をいくつか出すと、最初は綺麗に表示されて感動を誘うダッシュボードの登録件数のバーですが

件数が増えてくると、だんだんと表示を遅くする原因になります。

あと、これは実際に運用していて詰んだので文句しかないですが、has_manyは関連元、親から子供のデータを入力しやすい、使いやすいUIを提供してくれているのですが、has_oneでのデータの追加の面倒をみてくれない(まだ開発中!?)なのでこの編集は辛かったです。

他だと、belongs_toが設定されている場合、そこのカラムはセレクトボックスになるのですが、選択項目を上位30件までしか表示してくれないので、

運用が積み重なってデータが増えてくると、新規に子要素を追加するときに親要素を選択出来ない現象が発生しました。

この点に関してはこの管理画面からだけでは回避策が無いのでなんとかして欲しいところです。


active_admin

http://activeadmin.info/

星の数:8294


特徴

rails_adminとAdministrateの中間のカスタマイズ性と手軽さを持っているというと、一言で説明の付くgemです

コマンドを打ってやるだけでモデルの編集画面が勝手に生成されます


rails generate active_admin:resource User

これで、app/resource/ 以下に管理画面向けの設定を1ページ1ファイルの設定で作成しますので、必要に応じてそのファイルにカスタマイズを行なっていきます

以下のような書式のDSLで記述しないといけない学習コストがありますが

正直、普通要求される大体のカスタマイズがこのDSLの内部の書式で実現可能です

細やかなカスタマイズを求めなければ、生産性とカスタマイズ性のバランスの取れた非常に使い心地の良いgemです

# app/admin/posts.rb

ActiveAdmin.register Product do

# Create sections on the index screen
scope :all, :default => true
scope :available
scope :drafts

# Filterable attributes on the index screen
filter :title
filter :author, :as => :select, :collection => lambda{ Product.authors }
filter :price
filter :created_at

# Customize columns displayed on the index screen in the table
index do
column :title
column "Price", :sortable => :price do |product|
number_to_currency product.price
end
default_actions
end

end


欠点:

個人的に、非常にバランスが良いので、最初に触る管理画面拡張としてはこれを一番お勧めしたいですが

このgemの欠点は、用意されているDSLでできることを越えようとすると地獄。というのが一言でまとめられる特徴になります。

権限管理やデザインなどに細かい変更を求められる様になると限界が出て来ますし、そこから先はやらないであろう予想が立っているときに使う道具ですね。


Administrate

https://github.com/thoughtbot/administrate

星の数:4249

factoryg_girlなど、良く知られたgemを出している、thoughtbotが作っている管理画面様のgemがこれで2019年2月現在の versionが0.11と今後の互換性にまだまだ不安を個人的には持っているのですが、現段階で4000を超えるスターを集めているのはさすがのブランド力の、rails管理画面の新星です。

生産性のためにDSLを使うと、DSLで出来ること自体がカスタマイズの限界になる事をよく理解していて、シンプルでモジュール化されていて、上書きでなんでも直せる事を信条にしています。


特徴:


  • カスタマイズを重ねても、設計がとても破綻しずらい(というかほぼしない

  • 脇を固めるgemがたくさん存在しているのでマニアックな要望も探すと見つかる

そもそもthoughtbotという実績ある会社が、後発でこれまでのgemでの利点、欠点を良く調べた後に登場したgemなのが注目点ですが、結果としてDSLに頼らないでRailsの基本的な機能に出来るだけ頼る設計になったのが興味深いところです。

カスタマイズの方法は、基本的にはapp/dashboardsの下に、モデルごとの管理画面のファイルを設置します。

例としてはこんな感じでATTRIBUTE_TYPESCOLLECTION_ATTRIBUTESSHOW_PAGE_ATTRIBUTESFORM_ATTRIBUTESという変数に情報を書いていけばよい感じになっています。

require "administrate/base_dashboard"

class AdminUserDashboard < BaseDashboard
ATTRIBUTE_TYPES = {
id: Field::Number,
email: Field::String,
display_name: Field::String,
first_name: Field::String,
last_name: Field::String,
password: Field::Password,
role: Field::Enum,
stat: Field::Enum,
created_at: Field::DateTime,
updated_at: Field::DateTime,
}.freeze

COLLECTION_ATTRIBUTES = [
:id,
:role,
:display_name,
:email,
:updated_at
].freeze

SHOW_PAGE_ATTRIBUTES = [
:id,
:email,
:display_name,
:role,
:created_at,
:updated_at
].freeze

FORM_ATTRIBUTES = [
:email,
:display_name,
:role,
:password
].freeze

def display_resource(admin_user)
admin_user.display_name
end
end

通常のカスタマイズはこれで十分です

これ以外に、画像のアップロードなど、デフォルトでは未対応なものはrubygemsを「Administrate」で検索すると脇を画像のアップロードのフィールドに対応させたりするための多くのgemが見つかります。

https://rubygems.org/search?utf8=%E2%9C%93&query=administrate

何らかのgemでrailsの機能の拡張を行った場合、それにたいしてAdministrateがそれぞれ対応するというのは、現実的ではないので、plug-in化したというのが後発の強みで、割と広いバージョンに対して対応できるようになっています。


欠点:


  • この中では、インストール時の機能の見た目が一番イマイチ

  • 他のgemは持っている、ログイン画面を最初から実装していない

  • カスタマイズ性が高い分、その流儀を学んでカスタマイズするコストがある

  • まだバージョンが不安定なので、ある日積み上げた資産をおじゃんにするような破壊的変更が入る可能性がある

まだバージョンが若いとはいえ、実際バージョン0.4くらいから追いかけている感想としては、これまで破壊的な変更が入ったことはなくて、has_manyの関連周りなど、実装に悩むようなところに対して順々に実装方針を決めてきているだけで、バージョン上げて機能が壊れた記憶は無い状態です。

typusも死んでしまいましたし、お客様のカスタマイズの要件断れない様な恐れのあるものは、これをベースにするのがベストな選択肢ではないでしょうか。


typus

https://github.com/typus/typus

星の数:1138


特徴

コマンドで1テーブルが1ファイルの形式で、YAMLファイルを生成するので

初歩的な修正に関してはだいたいこれで対処可能です

下のものはデフォルトで吐き出されたYAMLファイルの一例です


User:
fields:
default: email, status, last_sign_in_at
relationships:
application: Application

必要に応じて、YAMLファイルに追記を行なっていくことで、カスタマイズを行います

User:

fields:
default: email, status, last_sign_in_at
# 一覧画面で表示するカラム
list: id, email, status, last_sign_in_at
# editアクションで編集できるカラムを指定
edit: status
options:
# editアクション中で、セレクトタグで選択できるものを指定
selectors: status
relationships:
application: Application
# メールアドレスで、ユーザー検索を行う
search: email
# 絞り込みのためのセレクトタグを画面に出す
filters: status

この様に、生成されたYAMLファイルの編集でほとんど必要なことは出来るのですが

さらにコントローラーやビューをカスタマイズするには

所定の位置に、コントローラーやviewを配置して、既存の機能を上書きしていきます。

例えばusersモデルのindexアクションのcontrollerやviewを編集したいときはそれぞれ次の作業を行えば良いです


  • /app/controllers/admin/users_controller.rb を編集

  • /app/views/admin/users/index.html.erb を作
    成してきて編集

こういう、機能を何でも上書き可能なカスタマイズ性がtypus最大の強みでしょう

さらに、部品化された機能を呼び出して組み合わせる事を徹底して作られているので

後で企画から此処にアレを追加してくださいと言われても

拡張、拡張を続けてもどこかで設計の破綻がおきずらいです。

ちなみにもっとカスタマイズ法を知りたい場合は、以下のリンクをどうぞ

自分の記事ですが

rails管理画面作成gem:typusカスタマイズ方法まとめ


欠点:

これは、大きな拒否理由が3つあります。


  • インストール時の機能の見た目がイマイチ(現在はAdministrateが一番簡素

  • ここ3年程度更新が大きく鈍っている

  • カスタマイズ性が高い分、typusの流儀を学んでカスタマイズするコストがある

  • railsのバージョンアップに合わせてtypusの仕様が若干変わる

正直、よく部品化されているということは、逆に上手なカスタマイズのためには、何処をカスタマイズすればいいのかを解析、学習するコストが一番かかります。

typusの利点は社外に公開をすることを想定しても耐えられる柔軟性なので、企画からあれやらこれやら拡張を求められる嫌な予感がしたら、こちらを選択して、逐次拡張を加えていくのが良いと思いますよ。

とは言っても、外部のユーザーに使ってもらうために、typus標準のtwitter-bootstrapoっぽいデザインを脱出して、1からデザイン起こしてください、とかになってくると、そろそろtypusを使っているメリットは薄くなっては来ますけどね。

typus自体は、カスタマイズを重ねていくと、数年後railsのアップデートの段階でtypusの本体のアップデートを求められがちなのもマイナス点です。

ここ数年で溜まっていたカスタマイズ資産を、新しいverのtypusにすり合わせ直すのは心が折れるところがあります。

自分で一から管理画面を設計開発するよりはそれを考えても安くつくんですけどね。

ただ、最近はtypus本体の更新が鈍ってしまっているので、まだ未完成ながらAdministrateも並行して検討しているというのが私の正直なところです。


まとめ

実際にそれぞれのgemを使っている他の人に、聞いてみたのですが

どのgemを使うということに関しては、意見の一致を見ることはできませんでした。

gem毎に、便利な範囲がきちんと棲み分けられているので、管理画面として、どの範囲の人がどこまでのカスタマイズを行いたいかというのを調べた上で、適切なシナリオを立てるのが良いと思います


  • rails_adminはノンカスタマイズで使って問題ない開発者向け

  • active_adminは表示項目と権限管理だけきちんと行えれば問題なく運用できる、社内ツール向け

  • typusは社外への公開を行ったり、高い要求が後々出る恐れがある場合向けの土台と思って使う

そう考えて導入してみてから、問題が発生したら他に持ち変える。慣れてきたらどれも一通り触ってみて考え直す、というのが良い使い方ではないでしょうか?

個人的に、他の人にたった一つだけお勧めを出すなら、今はactive_adminと答えています。

ちなみにactive_adminをオススメしておきながら、私の場合はメインにtypusを使って、補助的にrails_adminをノーカスタマイズでインストールして開発側でだけそれを使う構成にしています。どうせ最後は企画側のカスタマイズ要件がいろいろ入って複雑になるものだという経験論からなんでもカスタマイズ要件に答えられる事を一番重要なポイントにしていますが、実際は仕様と自分の経験値を加味して選択するのが重要ということですね。