よく使うgemをまとめてみる
前口上
先月まとめたように、SaaSブームの中でアプリからWebへの回帰が少し起きている感覚があり、アプリのバックエンドでAPIだけなら軽量フレームワークでいけた場合でも、画面の描画もやる場合はなんだかんだでフルスタックフレームワークの方が融通がきくように感じています。
とりわけB向けサービスではアクセスがそれほどないが業務要件が複雑という場合もあり、ORMの能力がダイレクトにビジネス上の競争力につながるため素朴なRailsでActiveRecordの構成がはまるケースも多いです。
Ruby on Railsでの開発は枯れに枯れているのですが、まとめたことがなかったのでよく使うライブラリー(gem)について書いておきます。
gemの選び方
他社事例を調べるのも大事ですが、Ruby Toolboxでだいたいの人気感を探るのもよいです。
スター数だけ見ると古くてメンテされていないgemの評価が高くなってしまう場合もあるので、最近のコミットや勢いをチェックしましょう。
Railsのアップグレードはそれなりにつらみが伴うことも多いので、本当に必要なgemのみ入れるというのも保守性の観点では大事です。
認証
Webフレームワークによっては組み込みのユーザー認証機構がある場合もあるのですが、Railsでは具体的なログインページまでフレームワークが提供していません。
- devise
- authlogic
- sorcery
あたりが認証系のgemでdeviseが一番人気です。
SNSログインを提供する場合OmniAuthなどの別のgemを使うことになるのですが、マイナーな認証gemだと自前実装が必要な場合もあります。
deviseに欠点がないわけではなく、例えばルーティングがリソース指向のパターンでないというissueが過去上がったことがあります。
テスト
テストgemは主に
- rspec
- minitest
の二つがあり、minitestで十分派もいるのですが、自分の過去実績で言えばrspecを使っていることが多いです。rspecの方がよりリッチな構文を使えます。
test用のseedデータはfactory_botを使って生成することが多いです。以前はfactory_girlという名前でしたがbotの方がよりよい名前ということで改名されました。(pythonのfactory_boyはboyのままなので少し悶々としています。)
テストデータは実際のDBに入れてもいいのですが、不要なケースにおいて入れないbuildというメソッドが使えるので、IOを省くことでテストを高速化できます。
昔保存したデータが少し経った場合の挙動をテストしたい場合があるのですが、以前はtimecopというgemを使っていました。今は組み込みのtravel_toで同じことが実現できます。
管理画面
DBの値をそのまま見るだけで十分なケースではgemを使ってもいいのですが、カスタマイズが必要なら管理画面ではgemを使わないのを推奨。素直にadmin namespaceに自前実装しましょう。
- (rails_admin)
モデル
- annotate
テーブル定義をモデルファイルに追加してくれるgem
- (activerecord-import)
bulkでimportできるようにするgem。Rails6から組み込みのinsert_allも使える。
- (enumerize)
Railsは組み込みでenum機能があるがi18n周りはenumerizeを使った方が便利説あり。
- discard
soft deleteのgem. 類似gemのparanoiaは組み込みmethodを上書きする設計が災いしRailsの変更に追従できなくなっている。discardは別methodにして組み込みmethodの上書きは避ける設計。
ファイルアップロード
- carrierwave
ファイルアップロードのgem. 後述のActiveStorageと違いモデルとアップローダーが割合独立。formのhelperが充実しており、formでファイルを添付した際にvalidationに落ちたとしても、次の送信時にデータをキープできる。
- active_storage
Rails組み込みのファイルアップロードのgem. ActiveStorageの登場により類似のpaperclip gemは非推奨となった。
carrierwaveよりファイルアップロードとテーブルの行作成がくっついているイメージ。
フォーム
reform, simple_formなどのgemはあるが、Form Objectを切り出したい場合でも素のclass(PORO: Plain Old Ruby Object)かActive Modelを継承したclassの使用を推奨
デコレーター
- draper
- active_decorator
あたりが有名
jsonシリアリゼーション
- jbuilder
遅いと言われることもあるが、素のjbuilderで十分なケースも多い。
モデルと密結合したactive_model_serializersはメンテが止まってきているので非推奨。
ページネーション
下記2つが人気. 個人的にはkaminariを使うことが多い。
- kaminari
- will_paginate
view
素のhtmlにerbで変数を埋め込むこともできるが、閉じタグが必要だったり可視性で劣るので
- haml
- slim
のどちらかを使うことが多い。HTMLのスニペットを使いたい場合、逆変換が必要なためつらみだがそこは我慢している(himlのような設計が個人的には理想)
viewが重い場合、view componentに切り出すケースもあり、Rails6.1から導入されたrender_inや
- (cells)
- (view_component)
などのgemもあるが、partialや自前実装で頑張っていることも多い。
lint
- rubocop
Rubyがstyle guideに沿っているかcheckするgem. auto correctがある。
- haml-lint
hamlのlinter gem.auto correctしてくれない。
- overcommit
gitの操作を元にlintを走らせるgem.
エラー検知
- bullet
N+1を検知するgem
- (brakeman)
脆弱性の観点でライブラリーの更新が必要かcheckするgem. 今はGitHubのvulnerability checkで似たようなことができる。
ジョブキュー
- Sidekiq
- Delayed::Job
- (Resque)
あたりが有名。Redisを用意できるならSidekiqでRDBだけで完結したいならDelayed::Job
定期実行
- whenever
crontabを直に編集するのはつらいので古典的には代表サーバーでwheneverを使うことが多い。ただ、最近はdockerベースのサーバー管理も多いのでその場合実行時だけdockerでタスク立てがち。
デプロイ
- capistrano
同じくdockerベースだと使えないが古典的にはcapistranoを使うことが多い。
全文検索
Rubyというよりインフラの話だがElasticsearchかSolrの会社が多い。最近はElasticsearchが優勢。ただAWSとの関係が悪化している。
- elasticsearch-rails
meilisearchもrubyバインディングに積極的でmeilisearch-railsというgemもある。
セッション
- redis-actionpack
- (kredis)
昔はmemcachedの会社もあったが最近はセッション管理はRedisを使っていることが多い。
redis-railsは非推奨でcacheは組み込み、sessionはredis-actionpackの使用が推奨されている。KredisというよりRubyのsyntaxに寄り添ったgemもある。
Webサーバー
- unicorn
- puma
がよく使われる。
所感
LaravelやDjangoと比べるとRailsが弱い部分もあるので、それもどこかでまとめたいです。