带有backbone-rails的Rails:EJS文件中的资产助手(image_path)

Jo *_*iss 12 ruby-on-rails erb ejs backbone.js asset-pipeline

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

<img src="<%= image_path("foo.png") %>"/>
Run Code Online (Sandbox Code Playgroud)

但当然,JavaScript中没有资产助手.

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

这就是我所知道的:

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

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

car*_*iam 25

实际上,有一种方法可以链接一个.jst.ejs.erb文件,虽然它没有文档,我只是通过查看EJS测试用例找到它.您可以告诉EJS使用{{}}(或[%%]或您想要的任何其他内容)而不是<%%>,然后ERB将不会尝试评估您的EJS呼叫.

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

EJS.evaluation_pattern    = /\{\{([\s\S]+?)\}\}/
EJS.interpolation_pattern = /\{\{=([\s\S]+?)\}\}/
Run Code Online (Sandbox Code Playgroud)

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

我希望Sprockets中有一个选项可以通过配置来处理这个问题,而不是明确地包含EJS,但是到目前为止,我无法做到这一点.


max*_*0rd 16

我可以看到两种方式.两者都不好.

当你说<%%= variable %>这是由ERB渲染的时候<%= variable %>,所以你可以加倍百分之一逃脱除了 asset_tags之外的所有东西,并且在前往EJS的途中通过一次ERB传递将继续存在.

如果你发现太粗...

如何使用ERB扩展来创建定义资产路径的不同javascript文件?然后使用资产管道来要求.

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

MyAssets = {
  'foo': <%= image_path("foo.png") %>,
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后在靠近舱单顶部的地方要求这个.然后引用全局变量但是在EJS中有效.


Jo *_*iss 5

对于那些愿意尝试HAML代替EJS:使用HAML咖啡通过haml_coffee_assets一直运作良好,我也是如此.

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

%img(src="<%= image_path('foo.png') %>")
Run Code Online (Sandbox Code Playgroud)

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