RailsでPryを使用して、コードbinding.pryでブレークポイントに到達したとき
どうやってここに来たのか、誰が電話をかけたのか、誰が電話をかけたのかなどを知りたいのですが、奇妙なことに、そのコマンドが表示されません。誰か知っている?
pry-stack_Explorer プラグインを使用すると、コールスタックを上下に移動でき(up
およびdown
を使用)、コールスタックを表示できます(_show-stack
_)など:
こちらをご覧ください:
_Frame number: 0/64
From: /Users/johnmair/Ruby/Rails_projects/personal_site/app/controllers/posts_controller.rb @ line 7 PostsController#index:
5: def index
6: @posts = Post.all
=> 7: binding.pry
8: end
[1] pry(#<PostsController>)> show-stack
Showing all accessible frames in stack (65 in total):
--
=> #0 index <PostsController#index()>
#1 [method] send_action <ActionController::ImplicitRender#send_action(method, *args)>
#2 [method] process_action <AbstractController::Base#process_action(method_name, *args)>
#3 [method] process_action <ActionController::Rendering#process_action(*arg1)>
<... clipped ...>
[2] pry(#<PostsController>)> up
Frame number: 1/64
Frame type: method
From: /Users/johnmair/.rvm/gems/Ruby-2.0.0-p0/gems/actionpack-3.2.8/lib/action_controller/metal/implicit_render.rb @ line 4 ActionController::ImplicitRender#send_action:
3: def send_action(method, *args)
=> 4: ret = super
5: default_render unless response_body
6: ret
7: end
[3] pry(#<PostsController>)>
_
Pryプラグインなしでこれを行うには(pry-stack_Explorerで問題が発生していました)、 caller
を見てください。
実際にプロジェクト名を探して、関係のないすべてのRails=スタック項目を除外します。たとえば、プロジェクト名がarchie
の場合、次のように使用します。
caller.select {|line| line.include? "archie" }
これは私が探しているスタックトレースを提供します。
より短い方法は次のとおりです。
caller.select {|x| x["archie"] }
これも同様に機能します。
Pryセッションのバックトレースを示す pry-backtrace があります。
wtf? もあります。これは、最新の例外のバックトレースです。より多くのバックトレースを表示するには疑問符を追加し、すべてを表示するには感嘆符を追加します。
Pryで help と入力して、他のすべてのコマンドを表示します:)
Gemライブラリ内で既に定義されている呼び出し元メソッドを使用できます。そのメソッドの戻り値は配列になります。そのため、その一連の行で検索用の配列メソッドを適用できます
以下も強力なトレースに役立ちます。 https://github.com/pry/pry-stack_Explorer
ポールオリバーの答えを拡張します。
永久に除外したいフレーズのリストがある場合は、Pryのカスタムコマンド機能を使用してそれを行うことができます。
~/.pryrc
:
Pry::Commands.block_command "callerf", "Filter the caller backtrace" do
output = caller.reject! { |line| line["minitest"] || line["pry"] }
puts "\e[31m#{output.join("\n")}\e[0m"
end
callerf
を呼び出すと、フィルタリングされたcaller
出力が生成されます。 #{output}
は、caller
の元の外観を再現するための色付けです。 here から色を取りました。
または、カスタムコマンドを作成したくない場合は、Ctrl+R
コマンド履歴を検索します。