将我的文件重命名为 .js.erb 允许我在 javascript 内写入 erb 但不能在 erb 内写入 javascript

Renaming my file to .js.erb allows me to write erb inside javascript but not javascript inside erb

我正在 rails 应用程序上使用 chessboard-0.3。0.js。由于 rails 资产管道的事情,我不得不编辑渲染图像的 js 代码的每个部分,例如 Pieces。 chessboard.js 的第 445 行说

cfg.pieceTheme =  'img/chesspieces/wikipedia/{piece}.png'

这当然会给 rails 带来问题,所以我用 .erb 扩展名重命名了棋盘并将该行更改为

cfg.pieceTheme =  <%= asset_path('chesspieces/wikipedia/{piece}.png') %> 

将所有需要的图像放入 assets/images 文件夹后。

我的问题是图像仍然没有得到渲染,我猜是因为 {piece}.png 放在那行的方式,基本上是 rails 帮助程序中的 js,对吗?我认为这就是为什么我的图像无法渲染的原因。 当然,我可以阅读整个 'almost 2000' 行代码并尝试找出一个接一个访问每个图像的方法,但我可能会在此过程中破坏其他东西,2k 行管理起来并不有趣对于像我这样的初学者。

有没有办法在不重写大部分代码的情况下解决这个问题?

我想最简单的方法是将您的棋子直接包含到 /public 中,这样它们就不会被散列。如果它们来自外部库,它们可能无论如何都不会改变,因此您无需担心缓存。

有一个替代方案需要重写一些 js。

基本上代码不起作用的原因是因为 erb 在渲染之前编译,但 js 在渲染之后执行,所以 asset_path 不正确且不是动态的。

您可以创建一个列出所有可用路由的对象,然后使用它来插入路径名。

假设您的循环类似于

var piecesList = [
  "first",
  "second"
]
$.each(var piece in piecesList) function(piece) {
  var image_path = "img/path/{piece}.png"
}

您可以像这样在一个对象中手动分配所有这些部分

   var piecesRoutes = {
     "first" : "<%= image_path('chesspieces/first.png') %>",
     "second" : "<%= image_path('chesspieces/second.png') %>",
   }

然后在循环中,像这样调用它们

var image_path = piecesRoutes[piece]