大ちゃんの駆け出し技術ブログ

RUNTEQ受講生のかわいいといわれるアウトプットブログ

【個人用】gemの使用理由まとめ

はじめに

こんにちは!大ちゃんの駆け出し技術ブログです。 下記Gemfileですがこれが自分のPFで使用したものです。

github.com

# Gemfile

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.7.3'

gem 'rails', '6.0.3.5'


# Assets
gem 'sass-rails', '>= 6'
gem 'webpacker', '~> 4.0'

# Authentication for Slack
gem 'devise', github: 'heartcombo/devise', branch: 'ca-omniauth-2'
gem 'ginjo-omniauth-slack', require:'omniauth-slack'
gem "omniauth-rails_csrf_protection"

# Slack API
gem 'slack-ruby-client'

# OGP
gem 'meta-tags'

# 権限
gem "pundit"
gem "administrate"

# Serializer
gem 'active_model_serializers', '~> 0.10.0'
gem "ams_lazy_relationships"

gem 'puma', '~> 4.1'
gem 'carrierwave'
gem 'fog-aws'

# Config
gem 'dotenv-rails', require: 'dotenv/rails-now'
gem 'parser', '< 2.6.6.0'

# cron
gem 'whenever', require: false

# Database
gem 'pg', '>= 0.18', '< 2.0'
gem 'redis-rails'

# Model
gem 'enum_help'
gem 'active_hash'
gem 'public_uid'

# UI/UX
gem 'rails-i18n'
gem 'devise-i18n'
gem 'jbuilder', '~> 2.7'
gem "tailwindcss-rails", "~> 0.3.3"
gem 'slim-rails'
gem 'html2slim'

# Error monitoring
gem 'sentry-rails'
gem 'sentry-ruby'

# Performance monitoring
gem 'newrelic_rpm'

gem 'bootsnap', '>= 1.4.2', require: false

group :development, :test do
  # Test
  gem 'factory_bot_rails'
  gem 'rspec-rails'
  gem 'simplecov', require: false

  #CLI
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  gem 'spring-commands-rspec'

  # Debugger
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'pry'
  gem 'pry-byebug'
  gem 'pry-doc'
  gem 'pry-rails'

  # Code analyze
  gem 'rails_best_practices'
  gem 'rubocop'
  gem 'rubocop-checkstyle_formatter'
  gem 'rubocop-rails'
  gem 'rubocop-rspec'
end

group :development do
  gem 'bullet'

  gem 'foreman'
  gem 'listen', '~> 3.2'
  gem 'web-console', '>= 3.3.0'

end

group :test do
  gem 'capybara'
  gem 'faker'
  gem 'webdrivers'
  gem "webmock"
end

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

今回は各Gemの使用理由を雑に述べていきたいと思います。

devise

github.com

言わずと知れた認証系アプリに必要な機能を簡単に追加できる便利なgem

仕様理由

Slackログインの方法を様々な方法で試した結果、deviseとomniauthの方法しかできなかったため。

SlacKという比較的ユーザ情報の悪用の危険度が高いものを使用するので、認証周りはあまり自分でコーディングすることはセキュリティ面で不安だったため避けたかった ↓ 認証gemを使用することは必須 ↓ * Sorcery・・・slack.rbが2016年より更新されていなかったため、正しく認証できずエラーが返ってきていた。

もうエラーは解決されたみたい。正しくログインできるかもしれない。 github.com

  • devise-token-auth・・・講師にもPRを出して1週間ほど試していたが解決できず断念

  • devise × omniauth・・・唯一slackログインが正常にできて、かつ認証をdeviseに任せられる方法だった

~'heartcombo/devise’とマスターブランチを指定している理由は対応Gemがrubygemsにリリースされていないので、masterブランチを指定している

~gem 'devise', github: 'heartcombo/devise', branch: 'ca-omniauth-2'と指定している理由については下記記事を参照

www.takayasugiyama.com

gem 'ginjo-omniauth-slack', require:'omniauth-slack'

github.com

Slackのauth用のgem。

仕様理由

比較的スター数が少ないが、メンテナンスが頻繁にされていたため使用しました。 用途としてはauthと同じ。

qiita.com

require:'omniauth-slack'としている理由は公式の書き方にそう書いてあるから

gem "omniauth-rails_csrf_protection"

github.com

仕様理由

omniauth2.0に対応するため。詳しくは下記記事。

zenn.dev

gem 'slack-ruby-client'

github.com

SlackとAPI通信を行うためのgem。

仕様理由

botと通信を行うときには基本的にこれを使っている。 ※ ユーザーの投稿とかは基本的にfaradayでAPI通信。

gem "pundit"

認可を管理するGem

github.com

仕様理由

Pundit vs cancancan

Punditの場合各モデルに対して権限を設定できる

cancancanの場合、各モデルの権限をすべてAbilityファイルに記述する

よって、モデル数が多い自分のアプリではPunditのほうがいいと思った

gem "administrate"

github.com

管理画面自体は自分だけがログインできる実装

理由:管理周りでもしミスでもしてSlack情報流れたら怖いと思い、自分だけが管理できる仕様にした。

よって比較的簡易的に管理画面を実装したかった

rails_admin active_admin Administrate

Administrateを選んだ理由は後々管理画面を実装する際にお客様にも使ってもらう必要があるため、カスタマイズの拡張性が高いgemを選んだ

gem 'active_model_serializers', '~> 0.10.0'

github.com

仕様理由

スター数が多きいのと、各モデルのシリアライズされたときのJSONのカスタマイズが容易。

qiita.com

gem "ams_lazy_relationships"

github.com

仕様理由

batch_loaderを使用してActiveModelSerializerのN + 1問題を良しなに解決してくれるgem

github.com

理由が少し心配なので後で下記記事から理由を抽出 bajena3.medium.com

gem 'carrierwave'

画像をアップロードするときに使われるライブラリ。

github.com

仕様理由

viewsをvue.jsで書く場合は、Carrier Waveを使うらしい(下記記事を参照)

qiita.com

  • 理由 erbを書かない場合はactive storageの強みを活かせない

erbを使うか否かの違いは、HTML内に<%= %>を使えるかどうか Active Storageは前提として、<%= %>でform_withで入力したりや@imageとかで画像表示をする時に、この中に画像の処理を記述することで、controllerのコード記述を少なく書ける

言い換えれば、<%= %>を使わずに画像を処理・保存するとなると、どこで画像処理などのプログラムを記述すれば良いかわかりにくい

その点、CarrierWaveを使う方法では、CarrierWave::Uploaderというクラスが生成され、ここに画像の処理するコードを記載すれば良いんだなとわかりやすい

gem 'fog-aws'

carriwaveを使用してAWSにアップロード。

仕様理由

carriwaveの通常の保存先はpublic/uploads配下

ファイルが重くなるためAWSのS3にアップロード

github.com

gem 'dotenv-rails', require: 'dotenv/rails-now'

環境変数管理

github.com

仕様理由

シンプルに環境変数を記載できる

heroku上だと環境変数をいちいち指定しなければならない。

master.keyファイルをアップロードできるのがcredentialを使用するメリット

gem 'enum_help'

enumI18n化するgem

github.com

仕様理由

enumの値を国際化できるから。機能が仕様理由。

gem 'active_hash'

github.com

仕様理由

Prefectureを登録する際に固定値となるため導入

のちにCategoryテーブルを追加するときにも使用

しかし、Categoryテーブルの場合はカテゴリーが増える可能性があったため、テーブルを作ってしまえばよかったと反省している

わざわざデプロイせずともデータを作成すればCategoryを追加できるのが強み

gem 'public_uid'

ランダム値を格納するカラムを作成。

github.com

仕様理由

SecureRandomの存在を知らなかった。。。変更するか検討する。

qiita.com

gem "tailwindcss-rails", "~> 0.3.3"

tailwindをインストールする

github.com

仕様理由

プロフ帳のデザインにする以上、Bootstrap感はあまり出したくなかったため導入

他にもsemantic UIとかあったけど、Tailwindのほうが流行っていたと感じたため導入

ファイル自体は非常に重いらしいが導入してそこまで重いと感じなかったので使用

gem 'sentry-rails' & gem 'sentry-ruby'

Sentryを導入するgem

docs.sentry.io

仕様理由

bugsnagと比較してドキュメントの記事数が豊富

Heroku上だと一番使われている

それに伴う開発サポート

github.com

docs.bugsnag.com

gem 'newrelic_rpm'

アプリケーションのパフォーマンスをあらゆる角度からリアルタイムで可視化

github.com

仕様理由

正直まだ活用できていないので後で見る

gem 'factory_bot_rails'

定義構文をわかりやすく書くことができるテストデータを作成するgem

github.com

仕様理由 テストデータとしては一番メジャーだと思う

gem 'rspec-rails'

こちらも言わずと知れたテストGem。

github.com

仕様理由

Miniテストよりも多く現場で使われているテスト形式だから

gem 'simplecov', require: false

Rspecで書いたテストのカバレッジを計測してくれるツールです。カバレッジとは、コード全体に対して、どの程度の範囲をテストがカバーできているかを算出したもの。

github.com

仕様理由

ある程度Rspecはちゃんと書きたいと思ってたため、simplecovがあればどの程度の範囲をテストがカバーしているか見れるので便利。

qiita.com

gem 'spring'

Spring は Rails アプリケーションの preloader(プリローダー)の gem 。 Rails アプリケーションをバックグラウンドで走らせたままにしておくことにより(pre + load = 前もってロードしておく)、bin/rails や bin/rake コマンドの2回目以降の起動時間が短縮

github.com

gem 'spring-watcher-listen', '~> 2.0.0'

springのファイルシステム検知方法をポーリング方式からlistenを使用した方法に変更する。 ポーリングとは、主となるシステムが他のシステムに対して一定間隔で順番に変更がないか確認する制御方式で、いつ起こるかわからないイベントを監視する際に用いられる。

github.com

gem 'spring-commands-rspec'

Springのrspecコマンドを実装

github.com

仕様理由 bin/rspecを使うことで二度目以降のrspecの実行時間の短縮につながる

gem 'better_errors'

デフォルトのエラー画面をわかりやすく整形してくれるgem。

github.com

仕様理由

デフォルトのエラーが面よりもデバッグがしやすく見やすい

www.youtube.com

### gem 'binding_of_caller'

上記better_errorsと一緒に使うことで、ブラウザ上でirbを使えるようになるgem。

github.com

仕様理由

デバッグが不可彫りできるので便利

gem 'pry'

もしかしたらいらないかも。。。。。。。 調べたら来れなくても動くかもしれない。。。

github.com

gem 'pry-byebug', gem 'pry-doc', gem 'pry-rails'

pry-rails

github.com

  • Rails console で Pry が起動するようになる
  • pry-rails を入れるまでは irb が起動する
  • show-routes などのコマンドが Rails console で使えるようになる
  • Rails console で help と打つと、使えるコマンドがわかる
  • binding.pry をソースコード中に挟むとそこがブレークポイントとなり、そこで処理を止めてデバッグできるようになる
  • pry-rails だけではステップ実行はできない

pry-byebug

github.com

  • binding.pry で止めたところからステップ実行ができる
  • 例えば next コマンドで一行ずつ実行できる
  • $ 現在のソースを表示

pry-doc

github.com

  • show-method コマンドで C で書かれたコードやドキュメントも出力できるようになる
  • show-method は Pry のコマンドで通常は Ruby で書かれたコードやドキュメントのみ出力できる

参考 qiita.com

gem 'rails_best_practices'

rails_best_practicesは、railsアプリのコードの質をチェックするメトリクスツール

github.com

gem 'rubocop', gem 'rubocop-checkstyle_formatter', gem 'rubocop-rails', gem 'rubocop-rspec'

github.com

Rubyに関わる構文規則チェック

github.com

Rubocopを回す際にチェックするフォーマットを指定できる

$ bundle exec rubocop --require rubocop/formatter/checkstyle_formatter --format RuboCop::Formatter::CheckstyleFormatter --no-color --rails --out tmp/checkstyle.xml

github.com

Railsに関わる構文規則チェック

github.com

rspecに関わる構文規則チェック

仕様理由

インデントやコードに問題がある場合の自動検出。ある程度きれいなコードにしたかった。

gem 'bullet'

N + 1問題を検出できる

github.com

仕様理由

モデル数が多くN + 1問題が非常に出やすいと思ったため、bulletを導入

gem 'listen', '~> 3.2'

ファイルの変更、追加、削除を検知し、何かしらの処理を行うことができるようになる。

gem 'web-console', '>= 3.3.0'

ViewまたはControllerのコードに「console」というメソッドを記述することでブラウザ上でコンソールの操作ができるようになる。

gem 'capybara'

ブラウザ上でテストを確認できる

「リンクのクリック」「フォームの入力」「画面表示の検証」などをコマンドでシミュレートできる

github.com

仕様理由 Rspecを実行する際にブラウザでも意図したとおりに画面が遷移しているか確認できるため

gem 'faker'

簡単に多種多様なダミーデータをデータベースに投入できるgem

github.com

仕様理由 ダミーデータ用

gem 'webdrivers'

webdriverの自動インストール、自動更新を行う。

gem "webmock"

外部へのHTTPリクエストをスタブ化してくれる

外部API呼び出しのあるアプリケーションを開発する場合、テストやローカル環境での動作確認まで本物のAPIを呼び出していると、時間がかかり開発の生産性が下がるのでAPIモックを使用する

github.com

仕様理由 APIを使用しているためSlackログイン用のMocなどが必要だった。

gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

タイムゾーンが記載されたライブラリで、Windowsではタイムゾーンが記載されたファイルがない為、このgemが必要となる。