Class: Jammit::Controller

Inherits:
ActionController::Base
  • Object
show all
Defined in:
lib/jammit/controller.rb

Overview

The JammitController is added to your Rails application when the Gem is loaded. It takes responsibility for /assets, and dynamically packages any missing or uncached asset packages.

Constant Summary

VALID_FORMATS =
[:css, :js]
SUFFIX_STRIPPER =
/-(datauri|mhtml)\Z/
NOT_FOUND_PATH =
"#{Jammit.public_root}/404.html"

Instance Method Summary (collapse)

Instance Method Details

- (Object) cache_package (private)

Tells the Jammit::Packager to cache and gzip an asset package. We can’t just use the built-in “cache_page” because we need to ensure that the timestamp that ends up in the MHTML is also on the cached file.



41
42
43
44
# File 'lib/jammit/controller.rb', line 41

def cache_package
  dir = File.join(page_cache_directory, Jammit.package_path)
  Jammit.packager.cache(@package, @extension, @contents, dir, @variant, @mtime)
end

- (Object) generate_stylesheets (private)

If we’re generating MHTML/CSS, return a stylesheet with the absolute request URL to the client, and cache a version with the timestamped cache URL swapped in.



57
58
59
60
61
62
63
64
65
# File 'lib/jammit/controller.rb', line 57

def generate_stylesheets
  return @contents = Jammit.packager.pack_stylesheets(@package, @variant) unless @variant == :mhtml
  @mtime      = Time.now
  request_url = prefix_url(request.fullpath)
  cached_url  = prefix_url(Jammit.asset_url(@package, @extension, @variant, @mtime))
  css         = Jammit.packager.pack_stylesheets(@package, @variant, request_url)
  @contents   = css.gsub(request_url, cached_url) if perform_caching
  css
end

- (Object) package

The “package” action receives all requests for asset packages that haven’t yet been cached. The package will be built, cached, and gzipped.



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/jammit/controller.rb', line 19

def package
  parse_request
  template_ext = Jammit.template_extension.to_sym
  case @extension
  when :js
    render :js => (@contents = Jammit.packager.pack_javascripts(@package))
  when template_ext
    render :js => (@contents = Jammit.packager.pack_templates(@package))
  when :css
    render :text => generate_stylesheets, :content_type => 'text/css'
  end
  cache_package if perform_caching && (@extension != template_ext)
rescue Jammit::PackageNotFound
  package_not_found
end

- (Object) package_not_found (private)

Render the 404 page, if one exists, for any packages that don’t.



82
83
84
85
# File 'lib/jammit/controller.rb', line 82

def package_not_found
  return render(:file => NOT_FOUND_PATH, :status => 404) if File.exists?(NOT_FOUND_PATH)
  render :text => "<h1>404: \"#{@package}\" asset package not found.</h1>", :status => 404
end

- (Object) parse_request (private)

Extracts the package name, extension (:css, :js), and variant (:datauri, :mhtml) from the incoming URL.

Raises:



69
70
71
72
73
74
75
76
77
78
79
# File 'lib/jammit/controller.rb', line 69

def parse_request
  pack       = params[:package]
  @extension = params[:extension].to_sym
  raise PackageNotFound unless (VALID_FORMATS + [Jammit.template_extension.to_sym]).include?(@extension)
  if Jammit.embed_assets
    suffix_match = pack.match(SUFFIX_STRIPPER)
    @variant = Jammit.embed_assets && suffix_match && suffix_match[1].to_sym
    pack.sub!(SUFFIX_STRIPPER, '')
  end
  @package = pack.to_sym
end

- (Object) prefix_url(path) (private)

Generate the complete, timestamped, MHTML url — if we’re rendering a dynamic MHTML package, we’ll need to put one URL in the response, and a different one into the cached package.



49
50
51
52
# File 'lib/jammit/controller.rb', line 49

def prefix_url(path)
  host = request.port == 80 ? request.host : request.host_with_port
  "#{request.protocol}#{host}#{path}"
end