什么呢?body = 1在rails 3.1资产管道中做什么?

Lee*_*lla 32 ruby-on-rails-3.1 asset-pipeline

在开发过程中,我的所有javascript资源都附加了body=1get变量.这到底是做什么的?

http://localhost:3000/assets/application.js?body=1
Run Code Online (Sandbox Code Playgroud)

Xor*_*lev 32

浏览Sprocket源代码我们发现:

  # Returns a 200 OK response tuple
  def ok_response(asset, env)
    if body_only?(env)
      [ 200, headers(env, asset, Rack::Utils.bytesize(asset.body)), [asset.body] ]
    else
      [ 200, headers(env, asset, asset.length), asset ]
    end
  end
Run Code Online (Sandbox Code Playgroud)

body_only? 设置时间 ?body=1 or true

对于静态资产,Asset.body定义为:

def body
  # File is read everytime to avoid memory bloat of large binary files
  pathname.open('rb') { |f| f.read }
end
Run Code Online (Sandbox Code Playgroud)

而将资产归还给自己的是"具有机架能力的身体对象"

# Add enumerator to allow `Asset` instances to be used as Rack
# compatible body objects.
def each
  yield to_s
end
Run Code Online (Sandbox Code Playgroud)

当我们查看时bundled_asset,Asset.body重新定义为仅检索资产的主体而不包括任何依赖关系.Asset.to_a定义为将数据作为传递给Rack的数组检索其自身以及所有依赖项.

通过这种方式,资产不会组合在一起,而是作为单个对象,因此单个CSS文件仍然是个体的.