如何在Rails 3.0.x中使用Sprockets 2(如何使用预编译资产)

时间:2011-08-03 22:44:05

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 sprockets asset-pipeline

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

到目前为止,我有这样的事情: https://gist.github.com/1112393

效果很好:

  • 我的资产在app / assets /,lib / assets,vendor / assets ......
  • 他们都在/ assets
  • 服务
  • 我可以使用链轮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中被覆盖以添加哈希,如果我没有弄错的话。

我该怎么做?

给我你的每一个想法!感谢。

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:2)

编辑:Harry Brundage重写了我的宝石,它使用了所有内容的更新版本,它可能就是您想要使用的内容:

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中有详细记录。对于您想要调整的大部分内容,您可以取消注释我已注释掉的行。