Ruby 3运行旧Sinatra应用遇Invalid yield语法错误求助
解决Ruby 3下Sinatra布局ERB的Invalid yield错误
问题原因
Ruby 3对ERB的语法解析规则更严格,旧版Sinatra布局里的<%= yield %>会触发语法错误——ERB不再允许在表达式输出标签(<%= %>)中直接使用yield。
解决方案
方案1:修改布局代码(无需更新依赖)
把layout.erb里的<%= yield %>替换为直接操作ERB输出缓冲区的代码:
<div class="container"><% @_out_buf.concat(yield) %></div>
ERB内部通过@_out_buf变量收集输出内容,直接调用concat方法把yield返回的模板内容追加到缓冲区,就能绕开Ruby 3的语法限制。
方案2:升级Sinatra版本(适配Ruby 3)
如果允许更新应用依赖,将Sinatra升级到2.1.0或更高版本(该版本已适配Ruby 3),旧的<%= yield %>写法就能正常运行。在Gemfile中修改:
gem 'sinatra', '>= 2.1.0'
执行bundle install完成依赖更新即可。
方案3:在Docker中安装旧版Ruby(可选)
如果不想改动代码,也可以指定Alpine镜像安装Ruby 2.x版本,示例Dockerfile:
FROM alpine:3.18 RUN apk add --no-cache ruby=2.7.8-r0 ruby-bundler ruby-dev
可通过apk search -v ruby命令查询对应Alpine版本支持的Ruby旧版号。
内容的提问来源于stack exchange,提问作者NickK
相关产品推荐
相关产品推荐

