Railsの開発必需gemをインストール

はじめに

Ruby on Railsでアプリ開発するにあたって、開発するアプリがどんなものであろうと最初に入れておきたいgemを紹介します。

ここではrubocopとpry-railsのインストール方法とその機能について触れていきます。

今回の差分はgithubの方にありますので参照してください!

Feature: railsの定番gemのインストールと設定 by yoshi-maruyama · Pull Request #4 · yoshi-maruyama/techport-rails-nextjs
実装内容・仕様 pry-railsを導入しました rubocopを導入しました rubocopのymlの設定を入れました rubocopのエラーを解消しました 動作確認方法 rubocop rubocop -A

rubocop

rubocopはrubyコードの静的解析ツールです。

ソースコードをアプリ全体で統一したコード規約に維持するのに役立ちます。また、複数人で開発している場合でもコーディング規約をrubocopで定義していると自動で良くないコードを弾いてくれるのでレビューのコストも大幅に削減することができます

インストール

それではインストールしていきましょう

rubocopライブラリをGemfileに追記します。

develop環境でしか使わないものなのでdevelopmentのみのgroupに配置します

...
group :development do
  # Use console on exceptions pages 
GitHub - rails/web-console: Rails Console on the Browser.
Rails Console on the Browser. Contribute to rails/web-console development by creating an account on GitHub.
gem "web-console" gem 'rubocop', require: false gem 'rubocop-performance', require: false gem 'rubocop-rails', require: false # gem 'rubocop-rspec', require: false まだrspecを導入していないのでコメントアウト。 # Add speed badges
GitHub - MiniProfiler/rack-mini-profiler: Profiler for your development and production Ruby rack apps.
Profiler for your development and production Ruby rack apps. - GitHub - MiniProfiler/rack-mini-profiler: Profiler for yo...
# gem "rack-mini-profiler" # Speed up commands on slow machines / big apps
GitHub - rails/spring: Rails application preloader
Rails application preloader. Contribute to rails/spring development by creating an account on GitHub.
# gem "spring" end ...

rubocopの導入方法を調べるとrubocop-rspecのgemも一緒にインストールすることが多いです。rspecはrailsのテストライブラリとして非常に素晴らしいものですが、アプリケーションに導入していないためコメントアウトにしています。

追記ができたらdocker compose exec backend bashでrailsのコンテナに入り、bundle installを実行します。

bundle installをしたので念のためrails restartをコンテナの中で実行してrailsを立ち上げ直しておきましょう。

rubocopの初期化のために下記コマンドを実行します

rubocop --auto-gen-config

これを実行すると、rubocop.ymlとrubocop-todo.ymlが自動で生成されます。

設定

自動生成されたままの状態で終わりにしてもよいですが、実装を進めていくとデフォルトの設定のままだと無理が生じたり、自分の気に入らない規約が適用されていることがあります。これを少しずつ調整していって自分や自分のチームにあった形を見つけていきましょう。

下記に私が今設定しているものを載せておきます

inherit_from: .rubocop_todo.yml

require:
  - rubocop-performance
  - rubocop-rails

AllCops:
  NewCops: enable
  Exclude:
    - "bin/**/*"
    - "db/schema.rb"
    - "db/fixtures/test/**/*"
    - "vendor/**/*"
    - "tmp/**/*"
    - "config/environments/**/*"
  TargetRubyVersion: 3.2

Layout/LineLength:
  Max: 100
  AllowedPatterns:
    - "^ *?#"
  AutoCorrect: false

Layout/MultilineMethodCallIndentation:
  Exclude:
    - "spec/**/*"

Style/AndOr:
  EnforcedStyle: conditionals

Style/BlockDelimiters:
  AllowedMethods:
    - lambda
    - proc

Rails/EnvironmentVariableAccess:
  Enabled: false

Style/TrailingCommaInHashLiteral:
  Enabled: true
  EnforcedStyleForMultiline: comma

Style/TrailingCommaInArrayLiteral:
  Enabled: true
  EnforcedStyleForMultiline: comma

Style/Documentation:
  Enabled: false

Style/ClassAndModuleChildren:
  Enabled: false

Style/AsciiComments:
  Enabled: false

Style/EndlessMethod:
  Enabled: true
  EnforcedStyle: allow_single_line

Metrics/BlockLength:
  Exclude:
    - "spec/**/*"
    - "config/initializers/*"
    - "config/routes/*"
  CountAsOne:
    - "array"
    - "hash"
    - "heredoc"
  AllowedMethods:
    - "included"

Metrics/MethodLength:
  Exclude:
    - "db/migrate/*"
  CountAsOne:
    - "array"
    - "hash"
    - "heredoc"

Metrics/ClassLength:
  Max: 200
  CountAsOne:
    - "array"
    - "hash"
    - "heredoc"

Metrics/ModuleLength:
  CountAsOne:
    - "array"
    - "hash"
    - "heredoc"

Metrics/AbcSize:
  Exclude:
    - "db/migrate/*"

Rails/BulkChangeTable:
  Enabled: false

Style/Lambda:
  EnforcedStyle: literal

Layout/FirstHashElementIndentation:
  Enabled: false

rubocop-todo.ymlは後でリファクタリングをする前提で、一時的にrubocopの解析対象から外しておくためのものです。今の段階では空にします

# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.

運用

ここまでできたらコンテナ内でrubocopを実行します。rubocopの実行コマンドは下記の通りです

rubocop

私の場合はこの時点で90件の警告がでました

25 files inspected, 90 offenses detected, 90 offenses autocorrectable

rubocopのコマンドのみだとコードの規約に合わないコードの位置、警告の内容が表示されるのみです。簡単なものであればrubocopには自動で修正してくれる機能がついています。

rubocop -A

-Aオプションは、動作に影響を及ぼす可能性のある修正が入ることがあるので、実行して修正された後は念のため動作確認をして実装した機能が壊されていないことをチェックするようにしましょう

基本的にはrubocop -Aをまず実行して、自動で直されないものは手動でエラーの内容を確認しながら修正していくことになると思います。

少なくともmainブランチには必ずrubocopのエラーがない状態を常に保ちましょう。どうしても直すことができない場合、直すことが適切ではない場合、後で直す予定だが今はできない場合などは、rubocop用のコメントアウトを付与したり、除外ファイルに列挙する、todo.ymlで除外するなどの方法をとりましょう

pry-rails

pry-railsはrailsのデバッグ機能を提供してくれるライブラリです

ブレークポイントを設定し、そこに処理が到達したらコンソールを起動してrubyのコードをインタラクティブに実行することができるようになります

railsにはデフォルトでdebuggerというgemがインストールされており、これも同様な機能がありますが、pry-railsの方が馴染みがあるのでこちらを使っています

インストール

Gemfileに追記します。本番環境では使わないものなので、developmentとtestのgroupのブロックに配置します

...
group :development, :test do
  # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
  gem "debug", platforms: %i[ mri mingw x64_mingw ]
  gem 'pry-rails'
end
...

railsのコンテナに入り、bundle installを実行します。念のためrails restartをしてrailsを立ち上げ直します。

使い方

これで使えるようになったはずです。動作確認をしていきましょう

ここから動作を確認するために今後の実装に必要ない差分を入れていきます。後で削除するのでこのタイミングでコミットしておくとよいです。

まずはサンプルでコントローラやhtmlを簡単に用意していきます

rails generate controller home index

home controllerのindex Actionを作成しつつhome/indexにアクセスすることでシンプルな画面が表示されるようになります。

まずはコントローラの中にブレークポイントを入れていきます。

pry-railsでブレークポイントを設定するには処理を止めてコンソールを開きたい箇所にbinding.pryをいれます。今回はindex Actionに到達したときに止めたいので下記のようにします

class HomeController < ApplicationController
  def index
    binding.pry
  end
end

http://localhost:3000/home/indexでブラウザを開きます。すると、ローディングが終了しなくなり、ログは下記のような状態で止まっていることを確認してください

dockerを使っている場合…

dockerを使わないで単にrailsを起動しているのであれば、立ち上げた時のログからコンソールが起動してコードを実行することができるのですが、docker上でrailsを起動している場合、docker compose upによって見えているログからはコマンドを実行することができません。

dockerをつかいつつpry-railsでコマンドを実行するには、別のターミナルを開いて

docker attach #{CONTAINER_NAME} bash で開かれるログ上で行う必要があります。

CONTAINER_NAMEはdocker container lsを実行して起動しているコンテナの中からrailsのコンテナのNAMESを割り当てます。私の場合はtechport-rails-nextjs-backend-1になっています。命名の規則としては{rootディレクトリ名}-{docker composeのサービス名}-1のように自動で名前が振られます。(docker attach techport-rails-nextjs-backend-1)

実行した直後は何も表示されないかもしれませんが、enterを押してみたり、ブラウザからrailsを動かしてみるとログが表示されたります。

コンソールの入力画面が表示されたら、whereami を打ってみましょう。現在のブレークポイントの前後のコードが表示されると思います。pry-railsのコンソールないで特別に実行できるコマンドです。

次はparams と入れてみましょう。そのアクションに入ったときのパラメータが返ってくると思います。

次はhoge = "foobar" としておき、次にhogeのみ打ってみましょう。hoge変数の中身が参照できると思います。

コンソール内で新規の変数を定義したり、メソッドも定義したりすることができます。

コンソールを修了する場合はexitを実行します。もしループ処理の中にbinding.pryを書いた場合は一度exitをしても次のループでまた止まります。全てのループをスキップして終了したい場合は!!!を実行するとできます

コンソールの中で定義した変数やメソッドはその後の処理に引き継がれるような動きをしますが、次の処理のときには元に戻ります

pry-railsのブレークポイントはコントローラ以外にもmodelやviewファイルの中でも動作します。

erbファイルの中でブレークポイントを入れるときは下記のようにします

<h1>Home#index</h1>
<p>Find me in app/views/home/index.html.erb</p>
<% binding.pry %>

ブレークポイントを使いこなせると不具合の調査や開発のスピードが早くなります。またソースコードやライブラリの理解を深めることにつながります。どんどん活用していきましょう!

おわりに

ここではrubocopとpry-railsを紹介しましたが、他にも便利なgemはあります。

例えば

bullet →N+1問題を見つけて警告をしてくれる

better_errors →エラー画面に付与される情報の拡張

などがあります。

気になるgemがあった際はどんどん試して開発の効率を上げていきましょう

コメント

タイトルとURLをコピーしました