9

Currently, when I get an error on an erb template (for use with HTTPServer/cgi) I do the following:

  • If it's a small change, revert, save and retest.
  • For a large change or new file, delete or comment 1/2 the code, and retest. Perform a binary search until I've deleted/found the broken code.

The call stack doesn't seem to correspond to anything in my .rhtml file.

(erb):6:in `block in <main>'
/opt/local/lib/ruby/1.9.1/erb.rb:753:in `eval'
/opt/local/lib/ruby/1.9.1/erb.rb:753:in `result'
bin/correct.rb:45:in `block in <main>'
/opt/local/lib/ruby/1.9.1/webrick/httpservlet/prochandler.rb:26:in `call'
brianegge
  • 29,240
  • 13
  • 74
  • 99

4 Answers4

12

Not sure if this is applicable to this problem but maybe it will help someone. I'm using rails 5 and if you put

    <% debugger %>

in your html.erb file it will pause the terminal window that your rails server is running in. From there you can debug whatever params or variables your html.erb file has.

Peter Tascio
  • 151
  • 2
  • 3
5

As Daniel said, most times the error message will help you to quickly find where the error is.

There are indeed some occasions on which it doesn't.

The dumber, faster way to do that binary search is to just insert a wrong line, like

<%= the_error_is_after_this_line %>

and then move the line until you find the exact row.

I'm not one of those bright programmers who can write tons of lines per time which just work; i usually develop by small steps and reload the page on browser each time.

That said, the better way to avoid hard to debug views (or methods, or whatever) is to write simple, short ones. My rule of thumb is that I must be able to read the whole view (or method) in the editor window, unless it's just plain html.

Always use helpers and partial views. Can you count more than two () or [] in a line of your erb view? If yes, use a helper.

Can you count more than two or three blocks in your view? Use some partials.

giorgian
  • 3,795
  • 1
  • 30
  • 48
  • Good stuff. I don't think he's using Rails, but it's easy enough to get the functionality of partials, and I'd recommend doing so if he is doing a lot of ERB work. – Daniel Lucraft Aug 29 '09 at 06:47
  • Thanks. I found a few things which also seem to help: don't use here documents, as the line numbers are too hard to figure out; and set the filename in the template object before rendering it. – brianegge Aug 29 '09 at 06:53
0

In general Erb errors tell you where they occurred. For instance here your error is on line 6 of the erb file. You have omitted the error message that came with the backtrace, but that usually tells you what kind of error to look for. For instance, in my simple test here:

NameError: undefined local variable or method `asdf' for main:Object
  from (erb):7
  from (irb):6

It is clear enough what is going wrong and where.

Can you post more information about your error and the erb that caused it?

Daniel Lucraft
  • 7,196
  • 6
  • 34
  • 35
0

On Rails 5 you can find the gem 'byebug' by default at Gemfile:

    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

Then you can use byebug on your controller, put it wherever you want and many times you need, it functions like a 'breakpoint' and finally run your server $ rails server

class UsersController < ApplicationController
   byebug
end

At command line write help for options, normally use letter 'c' to continue to the next breakpoint, or the letter 'n' to advance step by step and ctrl+d to exit.

 (byebug) help

  break      -- Sets breakpoints in the source code
  catch      -- Handles exception catchpoints
  condition  -- Sets conditions on breakpoints
  continue   -- Runs until program ends, hits a breakpoint or reaches a line
  debug      -- Spawns a subdebugger
  delete     -- Deletes breakpoints
  disable    -- Disables breakpoints or displays
  display    -- Evaluates expressions every time the debugger stops
  down       -- Moves to a lower frame in the stack trace
  edit       -- Edits source files
  enable     -- Enables breakpoints or displays
  finish     -- Runs the program until frame returns
  frame      -- Moves to a frame in the call stack
  help       -- Helps you using byebug
  history    -- Shows byebug's history of commands
  info       -- Shows several informations about the program being debugged
  interrupt  -- Interrupts the program
  irb        -- Starts an IRB session
  kill       -- Sends a signal to the current process
  list       -- Lists lines of source code
  method     -- Shows methods of an object, class or module
  next       -- Runs one or more lines of code
  pry        -- Starts a Pry session
  quit       -- Exits byebug
  restart    -- Restarts the debugged program
  save       -- Saves current byebug session to a file
  set        -- Modifies byebug settings
  show       -- Shows byebug settings
  skip       -- Runs until the next breakpoint as long as it is different from the current one
  source     -- Restores a previously saved byebug session
  step       -- Steps into blocks or methods one or more times
  thread     -- Commands to manipulate threads
  tracevar   -- Enables tracing of a global variable
  undisplay  -- Stops displaying all or some expressions when program stops
  untracevar -- Stops tracing a global variable
  up         -- Moves to a higher frame in the stack trace
  var        -- Shows variables and its values
  where      -- Displays the backtrace

(byebug)

Other option to display the debug(params): In the app/views/layouts/application.html.erb file under render footer and above put the next:

<%= debug(params) if Rails.env.development? %>

Finally I share this options as I know as a newbie in Ruby on Rails. Hope this helps.

Source of some help: https://rubyplus.com/articles/3631-Debugging-using-ByeBug-Gem-in-Rails-5

Gamaliel
  • 455
  • 6
  • 5