fv17の日記

Webエンジニアの備忘用ブログです。主にWeb界隈の技術に関して書いています。

Rails - byebug gemを導入してdebuggerでデバッグする

debuggerの使い方メモ (RubyMineでいいじゃん感)

導入と使い方

  1. byebug gemを導入
  2. debuggerをソースに組み込む
  3. Railsを実行するとコマンドラインで該当箇所で止まって色々調査できる
  4. Ctrl-Dで抜ける

代表的なコマンド

コマンド 説明
eval 変数の値、メソッドの戻り値を表示する。
s(step) 1ステップ進める。メソッドがあればその中に入る。
n(next) 1ステップ進める。メソッドがあってもその中には入らない。
f(finish) 今いるメソッドを最後まで実行し、呼び出し元へ。
c(continue) 処理を再開。ブレークポイントがない場合は最後まで実行し終了。
q(quit) Byebug / Railsを終了。

Ruby - Refinementsとは

書籍「メタプログラミング Ruby」の写経兼復習用。

Refinementsとは、Rubyにおけるオープンクラスのスコープを特定の範囲に限定するもの。

具体的に見ていくと、下記のようなオープンクラスを用いた場合、その影響範囲はアプリケーション全体となり、予期せぬところでコードを破壊するなどの危険性があった。

class String
  def to_alphanumeric
    gsub(/[^\w\s]/, '')
  end
end


そのため、Refinementsによりオープンクラスの効果範囲を特定のモジュールだけに限定できるようにした。下記のように、refine クラス名 do ... end の形式で宣言し、モジュール内でusingすることでオープンクラスの効果を限定することができる。

module StringExtentions
  refine String do
    def to_alphanumeric
      gsub(/[^\w\s]/, '')
    end
  end
end

module SomeModule
  using StringExtentions
  "#3, the *Magic, Number*?".to_alphanumeric # => "3 the Magic Number"
end

【オブジェクト指向】SOLID原則について

ググったけどリスコフの置換原則などに関して分かりやすい良記事が見つからなかった。

TODO(後で読む)

https://www.amazon.co.jp/dp/4797347783
アジャイルソフトウェア開発の奥義 第2版 オブジェクト指向開発の神髄と匠の技

【デザインパターン】テンプレードメソッドパターン

下記がわかりやすい。

RuboCop Airbnbの導入方法

RailsにRubocop Airbnbを導入する。

設定方法

Rubocop AirbnbGithubのInstallationに導入方法が書かれている。

  • Gemfileに gem 'rubocop-airbnb' の一文を追加
  • Gemfileと同じディレクトリに .rubocop.yml と .rubocop_airbnb.yml を新規作成

ただし、.rubocop.yml は公式Docに記載されている通りのままだと下記の現象が起きるため、対応が必要

.rubocop_todo.ymlが無いよと怒られる

公式docでは .rubocop.yml 作成時に .rubocop_todo.yml と .rubocop_airbnb.yml を inherit するように記載しているが前者はいらない。.rubocop_todo.ymlは「Rubocopでエラーとなっているが後で対応すること」を記載するファイルであり、必要になるまで不要。

rails newコマンド打ったばかりのコードに対して色々エラーが出る

configやdbなどのファイルに対してエラーが出る。特に問題ないはずなので下記に示した方法で除外する。vendorフォルダとかもチェックする必要ないので、状況に応じて除外対象に追加。

.rubocop.yml

inherit_from:
  - .rubocop_airbnb.yml

AllCops:
  Exclude:
  - 'bin/*'
  - 'config/**/*'
  - 'db/**/*'
  - 'spec/spec_helper.rb'

rubocopの実行

bundle exec rubocop -R -D

-Rオプション

--railsの省略形で、railsに特化したCopが実行される。毎回付けるのが面倒な場合は、.rubocop.yml で下記のように設定すればOK

AllCops:
  RunRailsCops: true

-Dオプション

エラーメッセージにおいて、各Copの名称が表示されるようになる。デフォルトでtrueとのことなので付けなくても良いかも(未検証)

Rubocop実行時の様々なオプション(フラグ)

様々なオプションがあるので、下記における「Other useful command-line flags」で確認できる
Basic Usage - RuboCop: The Ruby Linter that Serves and Protects