Rails 从 Asset Packager 升级到 Assets Pipeline

yzhang · 2012年12月16日 · 2062 次阅读

最近做的一个项目是把一个原来 Rails 2 的网站升级到 Rails 3.2。这个 project 里面用到了 Asset Packager 来管理 Javascript 文件。Rails 3.1 开始采用 Assets Pipeline 来管理 Javascript,stylesheet,和 images 等资源。在研究了一下 Asset Packager 以后,发现它做的事情和 Assets Pipeline 接近。升级的策略比较直接,如下:

  • 把 public/javascripts 下的文件拷贝到 app/assests/javascripts下。

  • 对应文件 config/asset_packages.yml 里面的每个 javascript package 名字,在 app/assets/javascripts 下创建一个文件。这个文件的名字格式如下: #{package_name}_package.js。这个文件里面列出原来 package 包含的文件。

例如文件 asset_packages.yml 里面包含如下内容

javascripts:
- base:
  - jquery/jquery-1.3.2
  - jquery/jquery.livequery
  - jquery/jquery.validate-1.5.1
  - jquery/jquery.blockUI

- ui_and_layout:
  - jquery/jquery-ui-1.7.2.custom
  - jquery/jquery.layout

现在文件 base_package.js 里面内容如下

//= require jquery/jquery-1.3.2
//= require jquery/jquery.livequery
//= require jquery/jquery.validate-1.5.1
//= require jquery/jquery.blockUI
  • 原来代码里面用 javascript_include_merged 来引用这些 packages。现在我们要用 Assets Pipeline 的方法来引用。个人认为比较好的办法是自己定义 javascript_include_merged,让它去调用 javascript_include_tag。具体方法如下:
# file app/helpers/application.rb
module ApplicationHelper
  def javascript_include_merged(*args)
    js_files = args.map {|arg| "#{arg}_package"}
    javascript_include_tag(*js_files)
  end
end
  • 如果你使用 assets precompiling,下面 1 行代码需要加入对应的 config 文件里

config.assets.precompile += %w( base_package.js )

以上步骤,不需要修改 View 里面的代码。调试也简单。又是快乐的一天。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号