12

我有一个使用codebrew/backbone-rails的 Rails 3.1 应用程序。在 .jst.ejs 模板中,我想包含一个图像,如下所示:

<img src="<%= image_path("foo.png") %>"/>

但当然资产助手在 JavaScript 中不可用。

链接 ERB (.jst.ejs.erb) 不起作用,因为 EJS 语法与 ERB 冲突。

这是我所知道的:

  • 资产助手在浏览器中不可用,因此我需要在服务器端运行它们。
  • 我可以通过使服务器将各种资产路径转储到 HTML 中(通过数据属性或<script>JSON)并在 JS 中读回它们来解决这个问题,但这似乎相当笨拙。

有没有办法以某种方式在 EJS 文件中使用资产助手?

4

5 回答 5

25

实际上,有一种方法可以链接 .jst.ejs.erb 文件,尽管它没有记录,而且我只是通过查看 EJS 测试用例才发现它。您可以告诉 EJS 使用 {{ }}(或 [% %] 或您想要的任何其他内容)而不是 <% %>,然后 ERB 不会尝试评估您的 EJS 调用。

确保在代码中的某处需要 EJS(我刚刚包含gem 'ejs'在我的 Gemfile 中),然后创建一个包含以下内容的初始化程序(我称之为 ejs.rb):

EJS.evaluation_pattern    = /\{\{([\s\S]+?)\}\}/
EJS.interpolation_pattern = /\{\{=([\s\S]+?)\}\}/

然后确保将您的模板重命名为 .jst.ejs.erb,并将现有的 <% %> EJS 解释代码替换为 {{ }}。如果您想使用 {{ }} 以外的其他内容,请更改初始化程序中的正则表达式。

我希望 Sprockets 中有一个选项可以通过配置来处理这个问题,而不是必须明确包含 EJS,但目前,据我所知,没有办法做到这一点。

于 2012-02-14T19:12:16.647 回答
16

我可以看到两种方式。两者都不是很好。

当您说<%%= variable %>这由 ERB 呈现为时<%= variable %>,您可以将除asset_tags 之外的所有内容翻倍,这将在通过一个ERB 传递到EJS 的过程中幸存下来

如果你觉得这太恶心了...

如何制作一个带有 ERB 扩展名的不同 javascript 文件来定义您的资产路径?然后使用资产管道来要求它。

所以说assets.js.erb定义如下:

MyAssets = {
  'foo': <%= image_path("foo.png") %>,
  ...
}

然后在清单顶部附近的某个地方要求它。然后引用在 EJS 中有效的全局变量。

于 2011-11-29T20:26:56.813 回答
5

对于那些愿意尝试 HAML 而不是 EJS 的人:通过haml_coffee_assets使用haml-coffee对我也很有效。

您可以在 .hamlc.erb 文件中包含以下内容:

%img(src="<%= image_path('foo.png') %>")

(它仍然没有给你路由助手,只有资产助手。)

于 2011-12-20T16:32:34.800 回答
4

Ryan Fitzgerald 非常友好地发布了他的 JavaScript 资产助手(使用 ERB 预编译)的要点:https ://gist.github.com/1406349

于 2011-11-30T21:22:24.890 回答
2

您可以通过以下 gem 使用相应的 Javascript 助手: https ://github.com/kavkaz/js_assets

最后(在安装和配置之后)您将能够像这样使用它:

<img src="<%= asset_path("foo.png") %>"/>
于 2013-11-15T12:04:47.063 回答