class Jammit::Controller
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.
Constants
- NOT_FOUND_PATH
- SUFFIX_STRIPPER
- VALID_FORMATS
Public Instance Methods
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
Private Instance Methods
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