我绝对不是开发人员,但我正在尝试让这个废弃的应用程序正常工作
这是名为layout.erb的文件中的代码,该文件是HTML
<div class="container">
<%= yield %>
</div>
它抛出此错误:
语法错误 - /wallop/app/views/layout.erb:53:无效产量:
我知道他们正在使用 Bootstrap,并且“yield”是 Ruby 中的一个特殊术语,% 应该打印和评估代码——我明白了,我只是不明白为什么它会出错。
这个应用程序是很久以前编写的并被放弃了,开发人员继续前进并制作了它的商业版本,因此他们对帮助更新旧源不感兴趣,我或多或少有兴趣修改它,以便我可以自学 Docker 和其他一些东西。
我没有尝试任何东西,只是研究了错误
我认为这可能与以下事实有关:这是一个旧应用程序,它是用 Ruby 2 编写的,而我正在运行 Ruby 3,但这只是一个猜测。
更新:
这是完全相同的问题,该应用程序也使用 Sinatra / Thin:
https://github.com/mocdaniel/dashing-icinga2/issues/121
他们通过恢复到旧的 Ruby 版本来修复它,但我不确定我是否能够轻松做到这一点
我正在使用 alpine:latest,然后从存储库中运行 apk add ruby-json ruby-dev 和 ruby-bundler,它正在获取最新版本…我不太了解 alpine 或 Docker,无法指定如何获取旧版本版本,我不想手动编译和安装它们。
修复代码以使用 Ruby 3 实际上可能更容易。
首先,是的,如果应用程序是用 Ruby 2.x 编写的,您应该尝试使用相同的 Ruby 版本来设置它。
如果没有更多背景信息,很难说出问题的根本原因是什么。也许布局中有多个未命名的
yield
语句?您可以在文档中阅读有关布局和渲染的更多信息 - https://guides.rubyonrails.org/layouts_and_rendering.html#understanding-yield
我想通了。我怀疑这个问题与 Ruby 3.x 破坏应用程序有关。由于我不是开发人员,最简单的解决方法是不使用 Ruby 3.x。
该应用程序使用像 Thin 和 Sinatra 这样的 gem,由于某种原因,它们在 Ruby 3.x 中被破坏了。
我能够搜索 alpine repo 网站,发现使用 FROM alpine:3.14 的 Docker 基础镜像提取 Ruby 2.7.6 软件包(而不是提取 Ruby 3.x 软件包的 alpine:latest),这解决了问题.
当我将运行某些 ruby 2.5 变体的 sinatra 应用程序更新到 3.1 时,我最终通过运行以下命令修复了语法错误:
bundle update --conservative sinatra
基于此答案
这将我的 Gemfile 对 sinatra 的依赖从 1.X 升级到了 4.0