はじめに
Ruby on Railsでアプリ開発するにあたって、開発するアプリがどんなものであろうと最初に入れておきたいgemを紹介します。
ここではrubocopとpry-railsのインストール方法とその機能について触れていきます。
今回の差分はgithubの方にありますので参照してください!
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 preloaderRails 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
基本的には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があった際はどんどん試して開発の効率を上げていきましょう
コメント