published under license CC4-BY
posted in category Software Development & Programming / Ruby on Rails
posted at 04. May '24
Debugging Ruby and Ruby on Rails Cheatsheet
Basic
puts
You can put puts or if it doesn't work, Rails.logger, almost everywhere (except some very weird DSL gems) - controllers, views (<% puts "blabla" %>), jobs.
binding.pry
The same, stops execution and provides command line. Pain to use to debug controllers in Docker, but still useful for tests.
More Advanced
caller
In a prompt or anywhere in a method add caller and it provides backtrace as an array.
irb(main):003> caller
=>
["/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb/workspace.rb:117:in `eval'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb/workspace.rb:117:in `evaluate'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb/context.rb:609:in `evaluate'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb.rb:1012:in `block (2 levels) in eval_input'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb.rb:1323:in `signal_status'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb.rb:1005:in `block in eval_input'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb.rb:1085:in `block in each_top_level_statement'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb.rb:1082:in `loop'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb.rb:1082:in `each_top_level_statement'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb.rb:1004:in `eval_input'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb.rb:988:in `block in run'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb.rb:987:in `catch'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb.rb:987:in `run'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.12.0/lib/irb.rb:884:in `start'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/railties-7.1.3.2/lib/rails/commands/console/console_command.rb:78:in `start'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/railties-7.1.3.2/lib/rails/commands/console/console_command.rb:16:in `start'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/railties-7.1.3.2/lib/rails/commands/console/console_command.rb:106:in `perform'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/thor-1.3.1/lib/thor/command.rb:28:in `run'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/thor-1.3.1/lib/thor/invocation.rb:127:in `invoke_command'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/railties-7.1.3.2/lib/rails/command/base.rb:178:in `invoke_command'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/thor-1.3.1/lib/thor.rb:527:in `dispatch'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/railties-7.1.3.2/lib/rails/command/base.rb:73:in `perform'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/railties-7.1.3.2/lib/rails/command.rb:71:in `block in invoke'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/railties-7.1.3.2/lib/rails/command.rb:149:in `with_argv'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/railties-7.1.3.2/lib/rails/command.rb:69:in `invoke'",
"/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/railties-7.1.3.2/lib/rails/commands.rb:18:in `<top (required)>'",
"<internal:/home/damon/.rbenv/versions/3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'",
"<internal:/home/damon/.rbenv/versions/3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'",
"bin/rails:4:in `<main>'"]
source_location
Find out where the method is defined exactly
OniSorceress::Content::Article.method(:find).source_location
=> ["/home/damon/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/activerecord-7.1.3.2/lib/active_record/core.rb", 243]
Returns nil for methods defined in C like String#to_s.
owner of method
Find out which module provides the method
"damon".method(:to_s).owner
=> String
Add Comment