在Sinatra 1.2.0和Ruby 1.9.2上使用Case Expression的SyntaxError

Jav*_*ier 3 ruby rack erb sinatra

我正在使用带有Ruby 1.9.2的Sinatra 1.2.0(我需要在这个项目中使用这个版本的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 %>
Run Code Online (Sandbox Code Playgroud)

错误:

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
Run Code Online (Sandbox Code Playgroud)

有趣的是:提到的第13行实际上并不存在于index.erb中.

您可以在Github上查看该应用程序的详细信息.它基本上由上面提到的index.erb组成.

非常感谢您的帮助!

Jak*_*mpl 5

问题是你不能在语句中有任意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
Run Code Online (Sandbox Code Playgroud)

如您所见,这里的第二行是导致问题的原因.你或许可以解决它让你的ERb压制换行符:

<% case @status; when "foo" %>
Run Code Online (Sandbox Code Playgroud)

或者(虽然这可能不起作用):

 <% case @status -%>
   <% when "foo" %>
Run Code Online (Sandbox Code Playgroud)