Carelyで利用しているRuby Gemについて
株式会社iCAREのエンジニアの安田です。
今日は、弊社サービスCarelyがどんな技術で構成されているかをご紹介したいと思います。
Carelyのおおまかな構成
Carelyの構成は、大まかに言って次のような構成になっています。
サーバー、ネットワーク: AWS
サーバーサイドアプリケーション: Ruby On Rails
フロントエンドアプリケーション: Vue.js + Buefy(Bulmaを使ったVue.jsのUIコンポーネント)
今日はその中でサーバーサイドアプリケーションに焦点を絞ってお話をしたいと思います。
サーバーサイドアプリケーションで利用しているRuby Gemについて
ここでは主にどんなRuby Gemを使っているかご紹介したいと思います。
認証、権限
まずCarelyはユーザー登録を必要とするサービスのため、認証システムが必要ですが、その部分は
devise
で実装されています。
最近では2段階認証を導入していますが、そこでは
devise-two-factor
を利用しています。
ユーザーは、ユーザーの種類によって権限が異なり、それぞれアクセスできるデータやページに制限がありますが、その制御はPundit
https://github.com/varvet/pundit
を使って実装しています。
フロントエンドとのデータのやり取り
フロントエンド(Vue.js)とのデータのやり取りはGraphQLによる実装が進んでいます。
その部分は
graphql-ruby
を使っています。
N+1問題の回避のためには
graphql-batch
を使っています。
ただ、全てのエンドポイントでGraphQLの導入が進んでいるわけではないため、フロントエンドとのやり取りの一部分はREST(的)形式をとっています。コントローラで取得したレコードをjbuiderを使ってjson形式にしてフロントエンドに返している箇所も存在します。
HTML, JS, CSS
viewファイルは、基本
slim
で記述されています。(メールテンプレートなどはerbのほうが記述しやすいためでerbを利用しています。)
ただ、最近の実装におけるビュー部分は、Vue.jsのコンポーネントに移りつつあるので、Slimを書く機会は減りつつあります。
js, cssのバンドラーとしてはwebpacker
を使っています。
ただ古いものに関しては、
sprockets(asset pipeline)
からあえて移行せずに、そのままasset pipelineを使って管理されているものもあります。
その他
ActiveRecordの無意味な値(例: 1,2)を有意味な値(例: ‘男’, ‘女’)に変換したり、その部分を国際化(i18n)対応させるにあたっては
enumerize
が使われています。
バックグラウンド処理では
sidekiq
ファイルアップロードは基本的に
refile
を使っています。
ただしrefileについてはgemの更新がほとんどされていないため、別のgemへの差し替えを検討中です。
使い方等はこちらにまとまっています。
URLでのリソースアクセス時にidではなくuuidを利用している(連番のidだと他のURLを推測できてしまうため)のですが、そのためには
friendly_id
を利用しています。
あとはページネーションには
kaminari
を使っていますが、これもBuefyのぺージャに置き換わりつつあります。
最後に
その他にもたくさんのgemを利用していますが、ご紹介はここまでにしたいと思います。
いかがでしたでしょうか?
個人的にはここまで書いてきて、「標準的だな、手堅いな」って感じで、ちょっと記事としての面白みには欠けるかな、って思ってしまいました。
GraphQLあたりはちょっと攻めてる感あるかな。どうなんだろう?