带有backbone-rails的Rails:EJS文件中的资产助手(image_path)
我有一个使用codebrew / backbone-rails的Rails 3.1应用程序。 在.jst.ejs模板中,我想包含一个图像,如下所示:
"/>
但当然资产助手并不适用于JavaScript。
链接ERB(.jst.ejs.erb)不起作用,因为EJS语法与ERB冲突。
这就是我所知道的:
- 资产助手在浏览器中不可用,因此我需要在服务器端运行它们。
- 我可以解决这个问题,让服务器将各种资产路径转储到HTML中(通过数据属性或
和JSON)并在JS中读回它们,但这看起来很笨拙。
有没有办法以某种方式在EJS文件中使用资产助手?
实际上,有一种方法可以链接一个.jst.ejs.erb文件,虽然它没有文档记录,我只是通过查看EJS测试用例找到它。 您可以告诉EJS使用{{}}(或[%%]或您想要的任何其他内容)而不是<%%>,然后ERB将不会尝试评估您的EJS呼叫。
确保在代码中的某处需要EJS(我只在我的Gemfile中包含了gem 'ejs'
),然后创建一个包含以下内容的初始化程序(我称之为ejs.rb):
EJS.evaluation_pattern = /\{\{([\s\S]+?)\}\}/ EJS.interpolation_pattern = /\{\{=([\s\S]+?)\}\}/
然后,只需确保将模板重命名为.jst.ejs.erb,并将现有的<%%> EJS解释代码替换为{{}}。 如果要使用{{}}以外的其他内容,请更改初始值设定项中的正则表达式。
我希望Sprockets中有一个选项可以通过配置来处理这个问题,而不是必须明确包含EJS,但是到目前为止,我无法做到这一点。
我可以看到两种方式。 两者都不好。
当你说<%%= variable %>
然后ERB将其作为<%= variable %>
呈现时,所以你可以将除了asset_tags之外的所有东西都加倍,并且在前往EJS的途中通过一次ERB传递将继续存在。
如果你发现太粗…
如何制作一个具有ERB扩展名的不同javascript文件来定义您的资产路径? 然后使用资产管道来要求。
所以说assets.js.erb
定义如下:
MyAssets = { 'foo': <%= image_path("foo.png") %>, ... }
然后在靠近舱单顶部的地方要求这个。 然后引用全局变量但是在EJS中有效。
对于那些愿意尝试使用HAML而不是EJS的人:通过haml_coffee_assets使用haml-coffee对我来说也很有用。
您可以在.hamlc.erb文件中包含以下内容:
%img(src="<%= image_path('foo.png') %>")
(它仍然不会给你路由助手,只有资产助手。)
Ryan Fitzgerald非常友好地发布了他的JavaScript资产助手的一个要点(可以预编译ERB): https : //gist.github.com/1406349
您可以通过以下gem使用相应的Javascript助手: https : //github.com/kavkaz/js_assets
最后(在安装和配置之后),您将能够像这样使用它:
"/>