来自数据库的asset_path(带指纹)?

时间:2016-10-25 21:17:15

标签: ruby-on-rails ruby ruby-on-rails-4 asset-pipeline

我开发了一个带练习的rails应用程序(适用于数学方面有学习困难的孩子)。练习的互动部分用javascript编写。我将每个练习存储在数据库中。 javascript包含

<%= asset_path('to_images') %>

我可以将脚本读入控制器并将内容写入部分内容,但我认为最好在变量中捕获脚本,例如:

@animation = exercise.animation

其中包含&lt;%= asset_path(...)%&gt;的任何代码将被替换为资产的正确指纹路线。

以下是exercise.animation中的代码段示例:

$("#hundred_square td").css({
    backgroundImage: 'url(<%= asset_path("exercises/shapes/circles/circle_open_black_48.png") %>)',
    backgroundSize: "2vw",
    backgroundRepeat: "no-repeat",
    backgroundPosition: "center"
});

我已经尝试

class Exercise < ActiveRecord::Base
include ActionView::Helpers::AssetUrlHelper

self.animation.gsub(/\<\%\=\s*asset_path\((.+)\)\s*\%\>/) do |match|
  address = $1
  puts "#{address}"
       =>  "exercises/shapes/circles/circle_open_black_48.png"
  puts "#{asset_path(address)}"
       =>  /"exercises/shapes/circles/circle_open_black_48.png"
  puts "#{ActionController::Base.helpers.asset_path(address)}"
       =>  /"exercises/shapes/circles/circle_open_black_48.png"
end

不产生我需要的结果。 谢谢你的建议!

1 个答案:

答案 0 :(得分:2)

获取MD5指纹值的一种方法是使用Sprockets&#39; find_asset方法,将逻辑路径传递到资产以获取Sprockets::BundledAsset实例。例如

[1] pry(main)> Rails.application.assets.find_asset('application.js')
=> #<Sprockets::BundledAsset:0x3fe368ab8070 pathname="/Users/deefour/Sites/MyApp/app/assets/javascripts/application.js", mtime=2013-02-03 15:33:57 -0500, digest="ab07585c8c7b5329878b1c51ed68831e">

您可以在此对象上调用digest_path,以便将MD5总和附加到资源。

[1] pry(main)> Rails.application.assets.find_asset('application.js').digest_path
=> "application-ab07585c8c7b5329878b1c51ed68831e.js"

有了这些知识,您可以创建一个帮助程序来返回应用程序中任何资产的digest_path,从您的.js.erb文件或模型中调用此帮助程序。

请参阅this answer for more details on this approach.