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.
The “package” action receives all requests for asset packages that haven’t yet been cached. The package will be built, cached, and gzipped.
# 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
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.
# 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
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.
# 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
Render the 404 page, if one exists, for any packages that don’t.
# 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
Extracts the package name, extension (:css, :js), and variant (:datauri, :mhtml) from the incoming URL.
# 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
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.
# 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