4

我正在尝试在我的 rails 3.0 app 中复制 rails 3.1 中引入的资产管道的基础知识

到目前为止,我有这样的东西: https ://gist.github.com/1112393 。

它工作得很好:

  • 我的资产在 app/assets/、lib/assets、vendor/assets...
  • 它们都在 /assets 提供
  • 我可以使用 sprockets 2 提供的所有东西等...

问题是,我不希望 rails 应用程序提供静态资产。服务器应该这样做。这就是为什么你可以在 rails 3.1 中预编译资产,如果我理解正确的话。所以我做了一个 rake 任务(使用 Sprockets::Environment 的预编译方法)。它有效,我的所有资产都在 /public/assets/。

例如,我有

  • 应用程序-02f8c96b342b4569513d0edf39ef55eb.css
  • 应用程序-505e8f472350fb1e0d15f6ad2f5e0389.js
  • 画廊图标-0e922050a85718fef3cd570df4eb5845.png

但是在 rails 3.1 中,您可以在 style.css.scss.erb 中执行类似的操作

background: url(<%= asset_path("gallery-icons.png") %>)

你会得到

background: url(/assets/gallery-icons-0e922050a85718fef3cd570df4eb5845.png)

在预编译文件中。

如果我没记错的话,stylesheet_link_tag 和 javascript_link_tag 也一样,它们在 rails 3.1 中被覆盖以添加散列。

我怎样才能做到这一点?

把你能想到的每一个想法都给我!谢谢。

4

2 回答 2

4

乔希在这里回答了我:https ://github.com/sstephenson/sprockets/issues/151

Assets = Sprockets::Environment.new(Rails.root) do |env|
    assets =  ["javascripts", "stylesheets", "images", "fonts"]
    paths =   ["app/assets/", "lib/assets/", "vendor/assets/" ].map{|p| assets.map{|f| "#{p}#{f}" } }.flatten

    paths.each{ |path| env.append_path path }

    env.static_root = Rails.root.join("public", "assets")
end

所以基本上,我有一个预编译资产的 rake 任务:

namespace :assets do
    task :precompile => :environment do
        Assets.precompile(*Rails.application.config.assets.precompile)
    end
end

我的问题主要是知道如何请求这些资产。答案很简单:

Assets['application.js'].digest

有了指纹,就很容易得到文件名。

我创建了助手来包含这些资产:sprockets_include_tagsprockets_image_tag.

木已成舟。

(虽然现在,我不能在我的样式表中使用这些助手(style.css.scss.erb))

于 2011-08-11T22:20:52.777 回答
2

编辑: Harry Brundage 重写了我的 gem,它使用了所有内容的更新版本,这可能是你想要使用的:

https://github.com/hornairs/sprockets-rails

老建议:

我制作了一个可以包含在 Rails 3.0.x Gemfile 中的 gem,它是 Rails 3.1 sprockets 集成的提取:

https://github.com/jamesmacaulay/sprockets_rails3_backport

与 Rails 3.1 的行为有一些不同,但它们在 README 中有详细记录。对于您想要调整的大部分内容,您只需取消注释我已注释掉的行。

于 2012-01-04T20:16:38.677 回答