2023/12/12

テクノロジー

【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月時点の情報です。

    著者:マイナビエンジニアブログ編集部