RailsでToDoサービスを作ろう(第7回)〜Railsでのデバッグ(byebug)とおまけでbetter_errors〜

にゅ~ぶる
にゅ~ぶる

こんにちは、にゅ〜ぶるです。

こんにちは〜、ぶるこだよ〜💕

ぶるこ
ぶるこ
にゅ~ぶる
にゅ~ぶる

さて、第7回目!最終回だよ!前回は、こちら
今日は、「Railsでのデバッグ(byebug)とおまけでbetter_errors」について、進めていきたいと思います!

にゅ~ぶる
にゅ~ぶる

いつものようにGemfileに追加してbundle installですが、byebugデフォルトで入っているので、既に追加されていれば追加する必要はありません。

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
にゅ~ぶる
にゅ~ぶる

でも一つ覚えておいて欲しいのが、
「group :development do 〜 end」ブロックの間に追加する必要があるということ。
※:testもあるけど

えぇ〜普通に追加したら動かないの?

ぶるこ
ぶるこ
にゅ~ぶる
にゅ~ぶる

動かないわけじゃないんだけど、こうすることで、「development環境にのみ追加する」という意味なんだ。
デバッグは開発中の環境でしか動かさない(よね?笑)
だから、こうやって、本番運用時には極力影響がないようにするんだ。

にゅ~ぶる
にゅ~ぶる

そしてデバッグとして停止したい箇所に「byebug」と1行追加します。
これがブレイクポイントとなり、実行された際に、そこで一時停止します。

class TasksController < ApplicationController
  before_action:set_task, only: [:show, :edit, :update, :destroy]

  # GET /tasks
  # GET /tasks.json
  def index
    authorizeTask
    byebug
    @q = Task.ransack(params[:q])
    @tasks = @q.result.page(params[:page])
  end
にゅ~ぶる
にゅ~ぶる

この状態で、「http://localhost:3000/tasks」にアクセスしてみましょう。
「rails s」で起動したコンソールがこんな感じに変わると思います。

[4, 13] in /Users/newburu/project/rails/todo/app/controllers/tasks_controller.rb
4: # GET /tasks
5: # GET /tasks.json
6: def index
7: authorize Task
8: byebug
=> 9: @q = Task.ransack(params[:q])
10: @tasks = @q.result.page(params[:page])
11: end
12:
13: # GET /tasks/1
(byebug)
にゅ~ぶる
にゅ~ぶる

この状態で、byebugのコマンド等を打つことでデバッグが可能になります。

にゅ~ぶる
にゅ~ぶる

必要最低限としては、こんな感じでしょうか。

◆実行関連
「n」…ステップオーバー(next)
「s」…ステップイン(step)
「c」…実行継続(continue)
「fin」…ステップアウト(finish)
restart 最初から実行し直す
◆変数表示
「p 変数名」…変数の中身を表示
「変数名 = 値」…変数に代入
「disp 変数名」…変数をウォッチする
 ※上の実行関連の操作をするたびに変数の中身が表示されます。

わかんない…

ぶるこ
ぶるこ
にゅ~ぶる
にゅ~ぶる

そうだね…
デバッグは慣れだと思う。何度もやってみて自分なりでもイイから使い方を覚えて行こう!一つ一つ、デバッグ用に「p 変数」をソースに直書きするより断然早くデバッグできるようになるからね!

にゅ~ぶる
にゅ~ぶる

「byebug」はここまで。次は、「better_errors」だよ。
これも、Gemfileに追加してbundle install。
これもdevelopmentの場合にしか使わないから、「byebug」と同じところに追加しようか。

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem'better_errors'
end
にゅ~ぶる
にゅ~ぶる

そして、テスト的に、異常終了させるために、次のようにしてみようか。

def index
  authorizeTask
  1/0
  @q = Task.ransack(params[:q])
  @tasks = @q.result.page(params[:page])
end
にゅ~ぶる
にゅ~ぶる

この状態で、「http://localhost:3000/tasks」にアクセスしてみましょう。
エラー画面が変わったのがわかると思います。

適用前
適用後
にゅ~ぶる
にゅ~ぶる

好み的なのもあるかもだけどね笑
でも、適用前は、画面下部にirbのコンソールがあったんだけど、なくなっちゃうので、それも追加しておこうね。そのためのGemが「binding_of_caller」。追加方法はもう知ってるよね?!笑

irb追加

わぁ〜追加されたぁ💕

ぶるこ
ぶるこ
にゅ~ぶる
にゅ~ぶる

以上!
これでRailsチュートリアルも終了になります。

ありがとうございましたぁ💕

ぶるこ
ぶるこ

最後まで読んでくれてありがとうございました!

Railsのチュートリアル的な感じで、
「Todoサービスを作る!」をテーマにお送りいたしました。
アジェンダは、こちら

質問等ありましたら、コメントなりTwitterなりで頂ければ対応させて頂きますので、遠慮なく利用くださいね。