テクノロジー

【Rails】汎用的に使えそうなgemたちまとめ

はじめに

こんにちは。23卒のT・Nです。
配属されて初めて触れたRailsについて、日々苦戦しつつ学んでいます。
この記事では、Railsで開発する上で欠かせないgemについて、汎用的なものをいくつか紹介したいと思います。
※勉強途中の若輩者です。間違っていたら優しい指摘をお願いします。

そもそもgemとは

標準のライブラリではなく、有志のすごい人たちが開発した外部ライブラリのことです。
インストールして使います。すごく便利だな〜と思いながら日々使っています。
興味がある人はコミュニティを見てください→RubyGems

紹介するgemたち

  • ransack・・・検索する
  • kaminari・・・ページ処理する
  • view_component・・・コンポーネント
  • letter_opener・・・メール見るやつ
  • seed_fu・・・データ投入するやつ
  • rubocop・・・コードを指摘してくれるやつ

多いです。あまりに多くて、ここに記すには余白が狭すぎるので、おおまかな機能だけを紹介しようと思います。
ちょっとだけ使用例を提示するために、TODOアプリ(仮)を作成します。まず、適当に画面を作ります。

並んでいます。すごく。
多忙な現代人です、日々管理すべきことは多いのでしょう。きっと。
積もること山の如しなタスクからたった一つを探そうなんて、大層なもんです。
効率的で優雅な画面を実現するために使用したいgemは、ransackとkaminariです。

kaminari

github

ページネーションを簡単に実装できます。

嬉しいところ

  • ページネーションを簡単に使える
  • コンテンツ数やページ表示を好きな感じにカスタマイズできる

使用例

インストールした後使いたいところのcontrollerに追記します。10個毎にページ変えたかったらこんな感じ。

def index
  @tasks = Task.all.order(created_at: :desc).page(params[:page]).per(10)
end

ページ処理したいindex.html.erbに追記します。たったこれだけです。

<%= paginate @tasks %>

ransack

github

検索gemです。よくある検索フォームを簡単に作れます。
ransackには、シンプルモードとアドバンスモードがあります。

嬉しいところ

  • 依存関係を追加することなく、Railsアプリケーションに検索を簡単に追加可能
  • アドバンスモードを使うことで、複雑な検索も標準的なRubyとERBでできる

使用例

シンプルモードでの例を紹介します。
インストールした後、modelに検索対象を追加します。

class Task < ApplicationRecord
  def self.ransackable_attributes(auth_object = nil)
    ["title"]
  end
end

controllerを編集します。

def index
    @q = Task.ransack(params[:q])
    @tasks = @q.result(distinct: true).page(params[:page]).per(10)
end

viewは以下のように非常にベーシックな検索欄を作りました。"_cont"は、部分一致で検索させたかったので指定しています。条件を簡単につけれるのも魅力的ですね。

<%= search_form_for @q, url: tasks_path do |f| %>
   <%= f.search_field :title_cont, class: 'form-control', placeholder: '検索ワード' %>
   <%= f.submit '検索' %>
<% end %>

ということで、kaminariとransackを使った結果。

ちょっとだけ賢そうですね!
こんな感じで、gemを使いこなすとスマートでモダンな何らかのアプリを簡単に実現できます。

view_component

github

コンポーネント志向UIを実現するgemです。
コンポーネント志向UIとは、ざっくり言うと、UIを再利用可能な部品(コンポーネント)に分割する感じの、環境にやさしいSDGs精神っぽいやつです。
例えば、どの画面でも共通して使用する「ボタン」があるとします。いちいち全ページに記述するよりも、コンポーネントにして使いまわした方が幸せになれます。

嬉しいところ

  • Componentベースで開発するので再利用が簡単
  • テストやデバッグがしやすい
  • ERBでそのまま呼べる

seed_fu

github

Railsには、初期データをデータベースに投入するためのseeds.rbファイルが最初から用意されています。
が、seed_fuを用いると、id(キー)を指定してレコード作成・更新ができます。
つまり、seedを実行する度に同じデータできちゃった…という事態を回避できます。

注意:seed_fuは更新が止まって久しいです。新規プロジェクトで採用するのは、できれば控えたいところです。

嬉しいところ

  • seedの一部を変更した時、変更したところだけ読み込める
  • 環境ごとに分けやすい
  • FIXTURE_PATHやFILTERオプションをつけることでパス変更できる
  • キーはid以外(ユニークであれば)も指定できる

使用例

基本的には rails db:seed_fu でデータを投入します。
ちょっと試します。db/fixtures/seed_test.rbを作成します。
例えば、Userテーブルがあって、emailがユニークだとします。emailをキーとして指定する場合は以下の感じです。

User.seed(:email) do |s|
  s.name = "me"
  s.email = "me@example.com"
  s.dog_name = "wanwan"
end

User.seed(:email) do |s|
  s.name = "you"
  s.email = "you@example.com"
  s.dog_name = "wanwan"
end

実行して、データを見ます。

irb(main):001> User.all
  User Load (0.1ms)  SELECT "users".* FROM "users" /* loading for pp */ LIMIT ?  [["LIMIT", 11]]
=> 
[#<User:0x0000000103dfa328 id: 1, name: "me", email: "me@example.com", dog_name: "wanwan">,
 #<User:0x0000000105817bc0 id: 2, name: "you", email: "you@example.com", dog_name: "wanwan">]

データをキー(email)で判定して、重複していた場合は「追加」ではなく「更新」となります。
例から、meの方だけ、 s.dog_nam = "w" に変えて実行します。

irb(main):001> User.all
  User Load (0.1ms)  SELECT "users".* FROM "users" /* loading for pp */ LIMIT ?  [["LIMIT", 11]]
=> 
[#<User:0x0000000103dfa328 id: 1, name: "me", email: "me@example.com", dog_name: "w">,
 #<User:0x0000000105817bc0 id: 2, name: "you", email: "you@example.com", dog_name: "wanwan">]

新規レコードは作成されずに、無事に更新できました!

letter_opener

github
アプリにメール送信を導入したとき、コンソールで確認するのって、面倒ですよね。
メール確認をするときにとても便利なgemです。

嬉しいところ

  • メールのプレビュー確認を視覚的に優しくできる
  • 間違えて送っちゃった!を防げる

使用例

localhost:3000/letter_opener にアクセスすると、ブラウザ上で送信したメールの確認ができます。
ターミナルばかりを眺めるのは不健康ですから、健康的で使いやすいのは素敵ですね!

RuboCop

github
RuboCopは、ソースコードの変なところを指摘してくれるgemです。インデントや空白のミス、ふさわしくない書き方まで教えてくれます。ついでに、簡単な修正ならば、半自動的に修正してくれます。
私は毎日RuboCopに修正してもらいつつ学んでいます。
また、RuboCopは、.rubocop.ymlを編集することで、検査対象や検査項目をアレンジすることができます。

嬉しいところ

  • コードの変な部分を知ることができる
  • 簡単な修正をしてくれる
  • 複数人がコードを書くチーム開発で導入する場合、書き方を統一できる
  • Cop(検査ルール)のカスタマイズ可能

使用例

bundle exec rubocop

オプションに -a を指定すると、自動修正してくれます。ちなみに修正オプションは、

  • a ... safeとマークされたCopのみ修正
  • A ... unsafeも含めて全てのCopを修正
    とありますが、個人的には、commit → bundle rubocop -A → git diffで確認するのがいいのかなと思っています。

おわりに

非常に雑多になりましたが、以上でgem紹介は終わります。
これからも色々試して、環境にやさしい素敵なRailsライフを送れるよう、精進していきたいと思います。

※本記事は2023年12月時点の内容です。

テクノロジーの記事一覧
タグ一覧
TOPへ戻る