SyntaxError с использованием выражения Case в Sinatra 1.2.0 и Ruby 1.9.2

Я использую Sinatra 1.2.0 с Ruby 1.9.2 (мне нужно работать с этой версией Ruby для этого проекта), и я не знаю, почему я сохраняю получаю эту SyntaxError. Я могу воспроизвести эту ошибку при использовании следующего в моем index.erb:

<% @status = "foo" %>
The case is: <br />

<% case @status %>
  <% when "foo" %>
    It's a FOO!
  <% when "bar" %>
    It's a BAR!
  <% else %>
    It's something else...!
<% end %>

Ошибка:

SyntaxError at /
/Users/foo/Workspace/sinatra_case_test/views/index.erb:4: syntax error, unexpected tIVAR, expecting keyword_when ; case @status ; @_out_buf.concat "\n " ^ 
/Users/foo/Workspace/sinatra_case_test/views/index.erb:5: syntax error, unexpected keyword_when, expecting keyword_end ; when "foo" ; @_out_buf.concat "\n It's a FOO!\n " ^ 
/Users/foo/Workspace/sinatra_case_test/views/index.erb:7: syntax error, unexpected keyword_when, expecting keyword_end ; when "bar" ; @_out_buf.concat "\n It's a BAR!\n " ^ 
/Users/foo/Workspace/sinatra_case_test/views/index.erb:13: syntax error, unexpected keyword_ensure, expecting $end

Забавно: упомянутой строки 13 на самом деле нет в index.erb.

Вы можете проверить информацию о приложении на Github. В основном он состоит из упомянутого выше index.erb.

Большое спасибо за вашу помощь!


person Javier    schedule 12.03.2011    source источник


Ответы (1)


Проблема в том, что в операторе case не может быть произвольных операторов. На самом деле это очень редкий случай, когда ruby ​​ограничивает возможности кода.

Принцип работы ERb заключается в том, что он вставляет операторы вокруг вашего кода, в который он направляет вывод. Вы можете увидеть это в своем журнале ошибок. В этом случае сгенерированный код выглядит примерно так:

case @status
@_out_buf.concat "\n "
when "foo"
@_out_buf.concat "\n It's a FOO!\n "
when "bar"
@_out_buf.concat "\n It's a BAR!\n "
else
@_out_buf.concat "\n It's something else...!\n "
end

Как вы видите, вторая строка вызывает проблему. Возможно, вы сможете решить эту проблему, если ваш ERb подавит concat новой строки:

<% case @status; when "foo" %>

или (хотя это может не сработать):

 <% case @status -%>
   <% when "foo" %>
person Jakub Hampl    schedule 12.03.2011