views:

408

answers:

2

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'
A: 

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
+2  A: 

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
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
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