読者です 読者をやめる 読者になる 読者になる

Rails Webook

自社のECを開発している会社で働いています。Rails情報やサービスを成長させる方法を書いていきます

Railsでデバッグをする

Rails初級 ツール

f:id:nipe880324:20150108215106p:plain:w420
Photo by Flickr: Pantera and Mateusz's Photostream

Railsで「変数の値を表示」から「ブレイクポイントを設定し、挙動を1ステップずつ確認するデバッグ」までのやり方を説明します。

動作確認

  • Ruby 2.1
  • Rails 4.1
  • pry-rails
  • pry-byebug

目次

  1. ビューファイルでのデバッグ
  2. モデルとコントローラーでのデバッグ
  3. ブレイクポイントを設定した本格的なデバッグ


1. ビューファイルのデバッグ

ビュー内では、次のようにdebugメソッドを使うことで、変数の値や、パラメーターの値を表示することができます。

# ビューファイル

<!-- インスタンス変数(@products)の値を表示する -->
<%= debug @products %>

<!-- paramsの内容を画面に表示する。-->
<%= debug params %>

<!-- 他にも、session、headers、params、flash、request、responseなどの値も表示できます -->


よくある開発中のみ表示したい場合は、if Rails.env.development?をつけることで、development環境の場合のみデバッグ情報が表示されます。

# ビューファイル

<!--  develompent環境のときにデバッグ情報を表示する -->
<%= debug  if Rails.env.development? %>


2. モデルとコントローラーでのデバッグ

モデルとコントローラーではビューと違って画面表示がないので、logger.debugメソッドを使い、ログファイルに情報を出力します。

# コントローラーかモデル

logger.debug "出力したいデバッグ情報"


ブレイクポイントを設定した本格的なデバッグ

まず、pry-byebugというデバッグを実行できるようにするGemを追加します。

# Gemfile
group :development, :test do
  gem 'pry-rails'  # rails console(もしくは、rails c)でirbの代わりにpryを使われる
  gem 'pry-doc'    # methodを表示
  gem 'pry-byebug' # デバッグを実施(Ruby 2.0以降で動作する)
  gem 'pry-stack_explorer' # スタックをたどれる
end


Bundlerでインストールします。

bundle install


あとは、ビュー、コントローラー、モデルなど詳細にデバッグを行いたい箇所にbinding.pryと記載するとそこがブレイクポイントになります。

あとは、実際にそこの箇所になれば、サーバーが停止し、interactiveなモードになります。

From: /Users/nipe0324/codes/rails_samples/debug_test/app/views/users/show.html.erb @ line 7 ActionView::CompiledTemplates#_app_views_users_show_html_erb__1221253090899921858_70168087519620:

     2:
     3: <p>
     4:   <strong>Username:</strong>
     5:   <%= @user.username %>
     6:   <% binding.pry %>
 =>  7: </p>
     8:
     9: <p>
    10:   <strong>Email:</strong>
    11:   <%= @user.email %>
    12: </p>
[1] pry(#<#<Class:0x007fa2918b37e8>>)>


そこで、変数の内容を表示したり、変数定義やコマンドを試すことができます。

[1] pry(#<#<Class:0x007fa2918b37e8>>)> @user.username
=> "testuser"

[2] pry(#<#<Class:0x007fa2918b37e8>>)> params
=> {"action"=>"show", "controller"=>"users", "id"=>"1"}


また、次の4つのコマンドでソース内を移動できます。

next   # 次の行に移動する
step   # 次の行か、メソッド内の行に移動する
exit     # 次のブレークポイントまで実行する
finish  # 現在のスタックトレース(画面に表示されているメソッド)が終わるまで実行する


nextで次の行に移動する。

[3] pry(#<#<Class:0x007fa2918b37e8>>)> next

From: /Users/nipe0324/codes/rails_samples/debug_test/app/views/users/show.html.erb @ line 11 ActionView::CompiledTemplates#_app_views_users_show_html_erb__1221253090899921858_70168087519620:

     6:   <% binding.pry %>
     7: </p>
     8: 
     9: <p>
    10:   <strong>Email:</strong>
 => 11:   <%= @user.email %>
    12: </p>
    13: 
    14: <%= link_to 'Edit', edit_user_path(@user) %> |
    15: <%= link_to 'Back', users_path %>


以上です。
開発中に思った通りに動かないといったときは是非デバッグを行い、効率的に開発を進めていってください。