はじめに
つい最近、Railsエンジニアとしてインターンを始めてからの業務経験が1年を超えました。業務未経験からweb系の自社開発企業に入ったとき、**「うわっ...、私の知らないgem多すぎ?」**と愕然としたことを覚えています。
そこから必死に業務に食らいつき、知らなかった数々のgemについて知見を深めてきました。今では、知らないgemでもドキュメントを読めばインストール・カスタマイズがだいたいできるようになりました。
ということで今回は、業務未経験からRailsエンジニアになった方が、現場に入ったときに最低限これさえ押さえていけばOKというgemを解説や参考記事つきで紹介したいと思います!
昔の自分がこの記事を読んだら、**「ありがてえ、ありがてえよ...」**と思うことうけあいです!
gem一覧
フロントエンド系
sass-rails
slim-rails
haml
解説
基本的に、cssはscss,もしくはsassという拡張言語で書きます。
HTMLに関しては、erb
で書くこともあるのですが、slim
,またはhaml
という拡張言語で書くことのほうが多いかなと思われます。僕はプログラミングスクールでerb
を勉強したのですが、インターン先ではhaml
でviewが書かれていて、「うっわ、こんなに簡単にHTMLが書けるんや!」とびっくりしました。
参考までに、erb
,haml
,slim
で同じコード、css
,scss
,sass
で同じコードを書いてみます。
<ul class="user-list" id="list">
<% @users.each do |user| %>
<li>
<p>
<%= user.name %>さん。
</p>
</li>
<% end %>
</ul>
%ul.user-list#list
- @users.each do |user|
%li
%p = user.name
ul.user-list#list
- @users.each do |user|
li
p = user.name
.user-list {
padding: 10px;
}
.user-list li {
padding-right: 15px;
}
.user-list li p {
font-size: 16px;
font-weight: bold;
}
.user-list {
padding: 10px;
li {
padding-right: 15px;
p {
font-size: 16px;
font-weight: bold;
}
}
}
.user-list
padding: 10px
li
padding-right: 15px
p
font-size: 16px
font-weight: bold
参考記事
RailsのHTMLテンプレートエンジン、Slimの基本的な記法
ユーザー登録系
devise
sorcery
解説
プログラミングスクールのカリキュラムやRailsの参考書などでは、ユーザー登録機能を1から自力で実装することが多いと思いますが、実務ではそのような車輪の再発明はしません。ユーザー登録機能では、devise
がデファクトスタンダードで、二番手でsorcery
が出てくる、といった感じです。僕はdevise
しか使用した経験がありません。
ちなみに、devise
はそのセットアップの簡易性ゆえにめちゃくちゃ便利なんですが、カスマイズの幅が無限大で、時々カオスになるため、deviseは沼という言説が流布しています。
参考記事
権限管理系
cancancan
pundit
解説
企業では、エンジニア以外の社員もプロダクトを触ったりするため(自社メディアで記事を書いくなど)、様々な権限をもつユーザーを生成することがよくあります。
そういうときに出てくるのが上述したgemです。例えば、権限がadmin
のユーザーはなんでもできる、権限がwriter
のユーザーは記事の執筆ができる、権限がnormal
のユーザーは外部向け、なんて分類が簡単にできるようになります。
管理者画面系
rails_admin
active_admin
administrate
解説
実務では、プロダクトを運営する際に、管理者画面というものを扱うことになります。そこからデータを投入したり、データを分析したりします。非エンジニアもエンジニアも触る画面のため、使用方法などがわかりやすくある必要があるのがポイントです。
僕はrails_admin
とactive_admin
を使用したことがありますが、どちらも一長一短(でした。個人的にはactive_admin
のほうが好きです。
結局の所は、設定の簡単さとカスタマイズの簡単さのトレードオフなので、プロダクトの仕様や開発の進捗度合いなどを考えてgemを選択する必要があるかなという感じです!
参考記事
開発効率アップ系
annotate
解説
モデルやルーティングの情報を書き出してくれるgemです。
これを使うと、
-
rails routes
をしてルーティングを確認 -
db/schema.rb
を見て、モデルの情報を確認
といった作業から開放されます!
参考記事
bullet
解説
僕は駆け出しの頃、N+1問題
をよく発生させてました。僕は駆け出しの頃、そもそもN+1問題
の存在すら知らなかったです(社員の方にコードレビューで指摘してもらい初めてN+1問題
を知りました)。
N+1問題とは、要はSQLのクエリーが必要以上に発行されてしまって動作が遅くなるということなんですが、このbullet
というgemは、そのN+1問題
を検知してくれる頼れるヤツなんです。
rollbar
解説
ローカルで動作確認はした、テストコードは書いた、そんな場合でも、本番環境でエラーが発生してしまうことはあります。
そういうときに便利なのがエラー検知ツールで、そのうちの一つがこのrollbar
でございます。Slackと連携して、エラーが起きたらSlackに自動通知、といったこともできます。
参考記事
デバッグ系
web-console
pry
解説
ローカルで開発をしているとき、エラーにぶち当たることは日常茶飯事です。エラーをデバッグするときに便利なのが、上で紹介しているgemたちです。
参考記事
web-console を使えば Rails App のデバックが楽になる
スクレイピング
nokogiri
解説
RailsでスクレイピングといったらNokogiri
、そんな感じのgemです。僕はこのgemを使ってエロサイトを作ったりしてました。
参考記事
Rails×スクレイピングでインスタ風エ○サイトをリリースしました!
画像系
cloudinary
carrierwave
解説
画像をゴニョゴニョするときには、だいたいこいつらを使います。画像サイズを変更したり、本番環境でAWSのS3にアップロードしたり、そういうことができます。
ページネーション
kaminari
解説
ページネーションがまさにkaminariの早さで実装できます。
多言語対応
i18n
解説
例えばAdminUserモデルを作ったときに、AdminUser
に対して、どういう言葉を当てるでしょうか。ユーザー
でしょうか、管理者
でしょうか、アドミン
でしょうか、アドミンユーザー
でしょうか。
仮にそのサービスで世界規模でバズり、英語圏のみならず、フランス語圏やスペイン語圏などにも広まった場合、どうするでしょうか。
i18n
は、そういうサービス上の用語
に対して一覧で訳語を当てることができます。このgemを使うことで、DRYかつスケールするようにできるわけですね。
参考記事
環境変数・秘密鍵管理
dotenv
解説
環境変数やら秘密鍵やらを管理するのに使います。
参考記事
テスト
rspec
factory_bot
解説
今でこそ告白しますが、インターンとして働くようになるまで、テストコードを書いたことがありませんでした。
しかし、まあ当たり前なんですが、実務でのテストコードの重要性を知り、機能の追加とテストは1セット、ということを実感しました。
Railsで動いているサービスだと、だいたい、上記のgemを使ってテストコードを書きます。
rspec
がテストコードを書くためのgem、factory_bot
がテストをする際のデータ生成のgem、といった感じです。
他にも、テストを書くためにほかのgemを使うんですが、それはrspec
でテストを書けば自ずと使うようになるので、わざわざ本記事で紹介はしません。
参考記事
使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する」
リンター
rubocop
解説
コードを解析して、非推奨の書き方などを指摘してくれる頼れるヤツです。CircleCIに組み込んで、非推奨の書き方があったら自動的にテストが失敗させる、といったこともできます。
ちなみに僕はvscodeを使ってるのですが、rubocopのプラグインを入れると、リアルタイムでコードを指摘してくれるので、非常に勉強になります。
参考記事
rubocopでrubyコードのベストプラクティスを学ぶ(Rails + Visual Studio Code)
メール送信系
letter_opener
letter_opener_web
解説
メール送信機能を実装するとき、ローカルで使うことになるgemです。
ローカル環境で実在するメールアドレスにメール送信されたらウザいですよね。そういうときにこれらのgemを入れておくと、送信メールをキャッチしてくれるので便利です。
letter_opener
とletter_opener_web
の違いはというと、letter_opener
は、メール送信が実行されるたびに別タブを開いてメールの中身を閲覧できます。letter_opener_web
は、送信したメールをlocalhost:3000/letter_opener
でまとめて閲覧できます。
個人的にはletter_opener_web
のほうが使いやすいですね!
参考記事
おまけ
Gatsby.jsで自作のブログを作ってみました。色々記事をアップしていきます!
http://keisukee.com/