On May 10, 2005, at 2:17 AM, Farrel Lifson wrote:

> Hi Rubyists,
>
> While writing a template with ERB I found that case statements do not
> seem to work:
>
> irb(main):001:0> template =<<EOS
> irb(main):002:0" <% case number %>
> irb(main):003:0" <% when 1 %>
> irb(main):004:0" <%= "one" %>
> irb(main):005:0" <% when 2 %>
> irb(main):006:0" <%= "two" %>
> irb(main):007:0" <% else %>
> irb(main):008:0" <%  "more than two" %>
> irb(main):009:0" <% end %>
> irb(main):010:0" EOS
> => "<% case number %>\n<% when 1 %>\n<%= \"one\" %>\n<% when 2 %>\n<%= 
> \"two\" %
>> \n<% else %>\n<%  \"more than two\" %>\n<% end %>\n"
> irb(main):011:0> require 'erb'
> => true
> irb(main):012:0> erbRunner = ERB.new(template)
> => #<ERB:0x2c497f8 @filename=nil, @src="_erbout = '';  case number ; 
> _erbout.con
> cat \"\\n\"\n when 1 ; _erbout.concat \"\\n\"\n_erbout.concat(( 
> \"one\" ).to_s);
>  _erbout.concat \"\\n\"\n when 2 ; _erbout.concat 
> \"\\n\"\n_erbout.concat(( \"tw
> o\" ).to_s); _erbout.concat \"\\n\"\n else ; _erbout.concat \"\\n\"\n  
> \"more th
> an two\" ; _erbout.concat \"\\n\"\n end ; _erbout.concat 
> \"\\n\"\n_erbout", @saf
> e_level=nil>

The problem is the way ERB compiles the strings. It basically tries to 
do the following with your snippet:

   case number
     _erbout.concat "\n"
     when 1
     _erbout.concat "\n"

and so forth, which is not valid Ruby syntax. Try the following instead:

   <% case number
        when 1 %>
      one
   <%   when 2 %>
      two
   <%   else %>
      something else
   <% end %>

- Jamis