SyntaxError с использованием Case Expression на Sinatra 1.2.0 и Ruby 1.9.2 - PullRequest
3 голосов
/ 12 марта 2011

Я использую 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, упомянутого выше.

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

1 Ответ

5 голосов
/ 12 марта 2011

Проблема в том, что в выражении 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 подавит символ новой строки:

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

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

 <% case @status -%>
   <% when "foo" %>
...