Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

知る人ぞ知る実用RubyGem 7選!Railsプロジェクトをレベルアップする隠れた名品

Railsプロジェクトで使える最高のRuby gemには、どんなものがあるのでしょうか?

この記事では、その答えをご紹介します!

今回は7つのgemを取り上げますが、何度も目にした定番のgemではありません。とても役立つのに、意外と知られていないgemをお届けします。

ただ、その前にひとつだけ…

注意点があります。

何でもかんでもgemに頼ってしまう開発者を見かけることがあります。

「もしかすると役立つかも」と思うだけで、gemを導入してしまうのです。

そのgemが本当に自分の抱える問題を解決するのか、最適な選択肢なのか、メンテナンスやドキュメントは整備されているのか——立ち止まって考えることなく。

これは間違いです。

なぜでしょうか?

プロジェクトが依存するものが増えるほど、環境の変化によって壊れるリスクが高まるからです。

そして、物事は常に変化しています。

新しいRailsのバージョン、新しいRubyのバージョン、新機能の追加など。

とはいえ…

gemは作業を大幅に節約し、コードをきれいに保ち、セキュリティ問題の回避にも役立ちます。賢く活用しましょう!

それでは、リストを見ていきましょう。

1. traceroute — デッドルートを見つけてコードをクリーンに保つ

Railsアプリケーションが成長するにつれ、ルートはどんどん増えていきます。

コードを変更していくうちに、一部のルートは不要になっていきます

もう必要ないのに…

それらはconfig/routes.rbの中に残り続け、管理を難しくしてしまいます。

どのルートを削除すべきか、どうやって見分ければいいのでしょう?

tracerouteというgemがあります。

このgemはアプリのルートを読み込み、定義済みのコントローラアクションと照合してくれます。

ただし、現時点で2つの制限があります

  1. Rails 6では動作しない
  2. 暗黙的なコントローラアクションを検出できない

筆者はRails 6対応のプルリクエストを送りましたが、さらにこれらの制限がない独自バージョンも作成しました。

2. strong_migrations — マイグレーションを安全にしてトラブルを未然に防ぐ

Railsのマイグレーションは、やり方を誤ると多くの問題を引き起こします。

例えば:

カラムの削除は問題のもとです。Railsはカラム情報をキャッシュしていますが、マイグレーションを実行してもこのキャッシュはリセットされません。

もう一つの例:

PostgreSQLを使用している場合、インデックスを追加すると、処理が完了するまでテーブル全体がロックされます。

これはユーザーにとって好ましい状況ではありません。

ロックされたテーブルへのアクセスが必要なリクエストに、アプリケーションが応答できなくなってしまうからです。

朗報は?

これらすべてを暗記しておく必要はありません。

strong_migrations gemを使えば、危険なマイグレーションが本番環境に反映される前に検出できます。

3. isolator — 安全でないトランザクションを防ぐ

Railsのトランザクションは、「オール・オア・ナッシング(全か無か)」の処理であるべきものです。

具体的にはこんな形です:

Book.transaction do
  # ...
end

しかし、ファイルへの書き込みやAPIリクエストのように、transactionの制御外の処理を行うと、この「全か無か」の保証は崩れてしまいます。

想像がつく通り、これはさまざまな不具合につながります。

解決策は?

実はハイテクな話ではなく、「副作用」——つまりトランザクションの外側の世界に影響を与える処理——を避けることです。

isolator gemがこれをサポートしてくれます。

すべてのトランザクションを監査し、安全性を確認します。

インストールするだけで、問題のあるtransactionを検出した際に例外を発生させてくれます。

ぜひ試してみてください!

4. test-prof + ruby-prof — 遅いテストを見つけて高速化する

遅いテストは誰にとっても苦痛です。

しかし、テストが遅い原因を見つけて修正するためのツールがあります!

その一つが、test-profruby-profの組み合わせです。

使い方はこうです:

TEST_RUBY_PROF=1 rake

出力結果:

%self       total     self       wait      child     calls   name
 43.21      2.001     2.001     0.000     0.000        1   Kernel#sleep
  2.97      0.184     0.138     0.000     0.046     1640   Array#permutation
  1.39      0.064     0.064     0.000     0.000      144   PG::Connection#async_exec

この例ではsleepの呼び出しがはっきりと見えますが、実際にはAPI呼び出し、大きなファイルの読み込み、遅いSQLクエリなどが原因になっていることも多いでしょう。

また、イベントプロファイラを活用する方法もあります。

こんな感じです:

EVENT_PROF='sql.active_record' EVENT_PROF_EXAMPLES=1 rake

これにより、どのテストが最も遅いクエリを実行しているのかを特定できます。

ちなみに、Rails 6では並列テスト機能が追加されました。既存プロジェクトをアップグレードする場合は、test/test_helpers.rbで有効化する必要があるので注意してください。

5. database_consistency — データの一貫性を高める

バリデーションは素晴らしい機能です。

しかし、どのフレームワークを使ってWebアプリケーションを構築していても、

データベースへ直接データを投入したり、生SQLでレコードを作成したり、ORMのバリデーションスキップ系メソッドを使ったりすれば、バリデーションをバイパスできてしまいます。

言い換えると…

バリデーションはユーザーのミスからは守ってくれますが、開発者のミスからは守ってくれないのです。

開発者のミスは、データの不整合を引き起こします。

朗報は?

ほとんどの(あるいはすべての)モダンなSQLデータベースは「制約(constraints)」を実装しています。バリデーションに似たルール群ですが、こちらはデータベースレベルで機能します。

データの一貫性を高めたいなら、これらの制約を実装しましょう。

database_consistencyというgemが役立ちます。

使い方は?

まずインストールします。特別なことはありません。

次に、チェックしたいプロジェクトのディレクトリ内で、ターミナルからbundle exec database_consistencyを実行します。

次のようなレポートが出力されます:

fail Comment title column should be required in the database
fail Comment author column should be required in the database

次にやることは?

不足しているデータベース制約(この場合はNOT NULL制約)を、change_column_nullマイグレーションで追加します。

6. attractor — リファクタリング!コードの「要改造ファイル」を特定する

コードを改善したいけれど、どこから手をつければいいかわからない——そんな経験はありませんか?

まずはメトリクスを取得しましょう!

循環的複雑度(cyclomatic complexity)やchurn(変更頻度)など、さまざまなコードメトリクスがあります。churnは、コードが時間とともにどれくらいの頻度で変更されるかを測る指標です。

どうやって測るの?

gitの変更履歴を使います。

結果として得られるのは?

最も変更回数の多いファイルのリストです。

作業時間の90%をUserモデルの変更に費やしているなら…おそらく巨大なファイルに長いメソッドが詰め込まれているはずです。リファクタリングの絶好の候補と言えます!

こうした頻繁に変更されるファイルを見つけるのに役立つのが、attractorというgemです。

実行方法:

attractor report -p app

HTMLレポートと、変更頻度の高いファイルのリストが出力され、リファクタリングの優先順位付けに活用できます。

これは本当に便利なツールです!

7. coverband — 本番環境で使われているコードと使われていないコードを見つける

最後にご紹介するのは、コード改善に役立つもう一つのツールです。

その名もcoverband

本番環境でこのgemを実行すると(オーバーヘッドは低めに設計されています)、実際に実行されているコードのカバレッジレポートを取得できます。

なんと、未使用のビューまで追跡可能です!

知る人ぞ知る実用RubyGem 7選!Railsプロジェクトをレベルアップする隠れた名品

この情報は、コード削除やプロジェクト整理の際の意思決定に大いに役立ちます。

未使用のコードを溜め込まないようにしましょう!

まとめ

今回は、主にRailsプロジェクトでテストを高速化し、コード品質を向上させ、安全性を高めるために活用できる、パワフルでありながらあまり知られていない7つのRuby gemをご紹介しました。

冒頭の「gemの乱用に関する注意点」は忘れずに。とはいえ、新しいgemを試すことをためらう必要はありません。

Rubyのスキルを磨きたい方、そしてこのブログを応援したい方は、拙著『Ruby Deep Dive』の購入をご検討ください。🙂

最後までお読みいただき、ありがとうございました!

  1. Ruby on Railsとは?初心者にもわかる仕組み・魅力・学び方を徹底解説

    Ruby on Railsとは? Ruby on Rails(略称:RoR)は、世界で最も人気のあるオープンソースのWebアプリケーションフレームワークです。プログラミング言語「Ruby」をベースに構築されており、シンプルなサイトから大規模で複雑なサービスまで、幅広いWebアプリケーションの開発を支援します。 そもそもフレームワークとは? フレームワークとは、ソフトウェア開発の際に土台となる構造を提供してくれるコードやツール、ユーティリティの集合体です。あらかじめ用意された構造に沿ってコードを書くことで、プログラムが整理され、保守性も高まります。正しく使いこなせるようになれば、開発作業は格段に

  2. 「Ruby on Rails Podcast」にゲスト出演しました!

    ポッドキャスト出演のお知らせ 先週、「Ruby on Rails Podcast」にゲストとして招かれました。番組では、このブログやメーリングリストで執筆している記事のこと、書籍の執筆、習慣づくりのコツ、そして多くの人がつまずきやすいポイントなど、さまざまなテーマについてお話ししました。 番組で取り上げた主なトピック ブログやメーリングリストでの記事執筆について 書籍を書くプロセス 習慣を身につけるための考え方と実践法 学習や成長の過程で人がつまずきやすい箇所 その他、Rails開発に関する幅広い話題 Ruby on Railsに関わる方だけでなく、学び方や習慣づくりに興味がある方にも楽し