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组成.
非常感谢您的帮助!
问题是你不能在语句中有任意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)
| 归档时间: |
|
| 查看次数: |
1218 次 |
| 最近记录: |