如何使用Assets Pipeline

九 15th, 2011

Rails 3.1之前,所有资源文件放在public的子目录下,如images,javascripts和stylesheets。有了asset pipeline后,这些资源文件被放在app/assets目录下。这个目录下的文件会被Sprockets这个中间件处理。它会包含在sprockets gem.
并不是说assets不能放到public下了,它们仍可以并且会被服务器当作静态文件处理。若你想让你的资源文件在被请求前做一些预处理,那请把它们放到app/assets下。

生产环境下,默认会把这些文件预编译到public/assets下,以便提高服务器处理效率。

当Rails生成scaffold或controller代码时,如果启用了coffee-rails,也会生成CoffeeScript文件;
如果启用了coffee-rails,也会生成SCSS文件。

例如,如果生成了ProjectsController,同时也会生成app/assets/javascripts/projects.js.coffee 和app/assets/stylesheets/projects.css.scss。

Asset存放路径

默认有3个:app/assets, lib/assets or vendor/assets
app/assets:被application拥有,如自定义的images,JavaScript文件或stylesheets
lib/assets:存放自己写的库需要的资源,或者是被多个applications共享的库
vendor/assets:存放外部实体需要的资源,如JavaScript插件的代码。

上面的路径被添加到了Sprockets的查找路径中。如果一个资源被请求,Sprockets会自动从3个路径中查找文件。如果找到同名的,则处理被向客户端返回。
可以在console中运行Rails.application.config.assets.paths查看路径。

向assets中添加自定义路径

在application.rb添加:

config.assets.paths << File.join(Rails.root, 'app', 'assets', 'flash')

引用全部js和css

<%= stylesheet_link_tag "application" %>
<%= javascript_include_tag "application" %>

注意:这样做很危险!,因为application会把assets目录及其子目录中所有的js或css全部引用进来,导致速度异常的慢。而且如果多个样式中定义了同名的样式,会相互覆盖,一定不要这样做。
但不幸的是application.html.erb中默认就是这样写的,强烈建议修改为只引用本controller相关的css或js.

单独引用某个controller的assets

<%= javascript_include_tag params[:controller] %> or
<%= stylesheet_link_tag params[:controller] %>
>>原创文章,欢迎转载。转载请注明:转载自Ruby迷,谢谢!
>>原文链接地址:如何使用Assets Pipeline
  1. 5swords
    二 23rd, 201208:34

    而且如果多个样式中定义了同名的样式,会相互覆盖,一定不要这样做。

    问题是在production里,一个个文件(css,js)分开的话,要在precompile += 后面一个个加。当然可以写一点程序来加,问题是assets是不是不鼓励这么做?或者现成的另有其他我们没了解的做法?

    • 老宋
      二 24th, 201209:39

      同名覆盖并没有关系,注意先后顺序即可。
      自己的cs,js不要在直接precompile +=。可以把他们路径加到 app/assets/javascripts/application.js和app/assets/stylesheets/application.scss,直接require文件名即可。具体参考http://guides.rubyonrails.org/asset_pipeline.html