Используя Pry in Rails, когда я нажимаю точку останова в коде 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
.
На самом деле я ищу название своего проекта, чтобы отфильтровать все ненужные элементы стека рельсов. Например, если бы мой проект был назван, archie
я бы использовал:
caller.select {|line| line.include? "archie" }
Это дает мне трассировку стека, которую я ищу.
Более короткий способ:
caller.select {|x| x["archie"] }
Что работает так же хорошо.
caller.reject {|x| x["vendor/bundle"] || x["/.rbenv/versions/"] }
Существует pry-backtrace, который показывает обратную трассировку для сеанса Pry.
Еще есть wtf? . Который показывает след самого последнего исключения. Добавьте больше вопросительных знаков, чтобы просмотреть больше следов, или восклицательного знака, чтобы увидеть все.
Введите help в pry, чтобы увидеть все остальные команды :)
pry-backtrace
в порядке, но pry-stack_explorer
плагин намного мощнее (хотя это еще одна жемчужина, плагин)
Вы можете использовать вызывающий метод, который уже определен внутри библиотеки гемов. Возвращаемое значение этого метода будет массивом. Таким образом, вы можете применить методы массива для поиска в этой группе строк
Ниже также полезен мощный след. 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
. Я взял цвет отсюда .
В качестве альтернативы, если вы не хотите создавать собственную команду, используйте Ctrl+R
для поиска в истории команд.
~/.pryrc
. Если нет, просто создайте его. ~/
всегда означает домашнюю папку в системах Unix.