通过构建所有asset_path值来避免使用* .js.erb文件

时间:2011-12-15 15:56:46

标签: ruby-on-rails erb asset-pipeline sprockets

所以我想避免使用ERB处理JavaScript文件,这样我就可以获得适当的资产路径,例如图像。

目前,这似乎是一种流行的方法:

var myImage = "<%= asset_path('my_image') %>";

当然,要求将文件名更改为“* .erb”,以便进行处理。

我更倾向于将ERB丑陋与我项目中的一个点隔离,制作一个清单文件(例如“assets.js.erb”)来计算并提供我需要的所有资产路径。

我当然可以通过逐案处理来解决这个问题:

ASSETS =
  "my_image": "<%= asset_path('my_image') %>"

window.assetPath = (path) -> ASSETS[path]

但是,我真的只是写一些ERB来递归我的所有asset_paths.asset_environment.paths并为我构建一个大对象文字清单,这样我真正的应用程序JavaScript就可以自信地调用:

var myImage = assetPath('my_image');

关于(1)的任何想法是否有更容易的方法来做我错过的,或者(2)我如何完成对asset_path的所有潜在有效参数的搜索?。

3 个答案:

答案 0 :(得分:6)

更简单的方法:

  1. 在.js.erb中获取资产前缀:&lt;%= Rails.configuration.assets.prefix%&gt;。如果需要一个绝对路径,你也可以获得应用程序URL(从rails获取它更复杂,所以你可以在.js.erb中对它进行硬编码?)

  2. 如果您正在使用预编译资产,请获取存储在 manifest.yml 中的文件指纹(在&lt;%= Rails.configuration.assets.manifest%&gt; )。清单包含一个列表,其中包含您的所有资产及其各自的指纹(documentation

  3. 使assetPath只将应用程序URL +前缀添加到您的图像名称或指纹

  4. 不方便的是,您必须指定完整的图像名称(包括扩展名)。

答案 1 :(得分:1)

这取决于使用此图像的位置。

用例1:图像是装饰性的,需要动态交换。 示例:Spinner,正在加载数据。 在这种情况下,我指的是在我的sass和java脚本中。

.spinner
   background-image: url(image_path("spinner.png"))

然后我将使用java脚本中的类而不是图像。

   $.addClass('spinner')

用例2:图像是对象的一部分。

当图像实际属于某个对象时,有很多种情况。在这种情况下,我创建了一个json文件,它存储数据和图像引用。然后我使用erb打开图像引用 - my_object.json.erb:

 {
    "icon" : "<%=image_path("icons/my_icon.png")%>",
    "label":"My label",
    "description":"My description"
 }

用例2需要在javascript端进行更多工作来加载json文件,但它会打开非常强大的可扩展性选项。

资产管道处理两个着名的案例。

答案 2 :(得分:1)

老问题,但有很好的方法来实现这一目标。只是为了解释我的解决方案的背景:我需要在地图中显示标记,这些标记具有基于JS动态变量的不同可能图标。奇怪的是,使用&lt;%= asset_path('“somefunction(raw_value)+”')%&gt;没有用。然后,我已经找到了解决方案。

具体来说,我使用的解决方案只有一个js.erb文件,它存储图像的值,以及它们的指纹名称,可以通过函数image_path获得。之后,我的所有其他JS文件都可以免除asset_path,因此.erb

使用以下内容在images.js.erb中创建文件your_application/app/assets/javascripts

<%
    imgs = {}
    Dir.chdir("#{Rails.root}/app/assets/images/") do
        imgs = Dir["**"].inject({}) {|h,f| h.merge! f => image_path(f)}
    end
%>

window.image_path = function(name) {
    return <%= imgs.to_json %>[name];
};

application.js中需要此文件,该文件通常位于上述目录中:

//= require ...
//= require ...
//= require images
//= require_tree .

然后,在您使用<%= asset_path('image.png') %>的JS中,您将使用image_path('image.png');

this博客文章的帖子,用于发布我自己的咖啡脚本版本。