class Rack::JQuery
jQuery CDN
script tags and fallback in one neat package.
Constants
- DEFAULT_OPTIONS
Default options hash for the middleware.
- FALLBACK
This javascript checks if the jQuery object has loaded. If not, that most likely means the
CDN
is unreachable, so it uses the local minified jQuery.- FALLBACK_PATH
path to the fallback script
- JQUERY_FILE_NAME
Current file name of fallback.
- JQUERY_VERSION
the version of jQuery it supports.
- JQUERY_VERSION_DATE
This is the release date of the jQuery file, it makes an easy “Last-Modified” date for setting the headers around caching. @todo remember to change Last-Modified with each release!
- VERSION
the version of this library
- WARNING
For CDN’s that don’t support the current release.
Public Class Methods
@param [Hash] env The rack env hash. @param [Hash] options @option options [Symbol] :organisation Choose which CDN
to use, either :google, :microsoft or :media_temple, or :cloudflare. This will override anything set via the ‘use` statement. @return [String] The HTML script tags to get the CDN
. @example
# in a Haml file (or any type of template) Rack::JQuery.cdn env # Choose the organisation Rack::JQuery.cdn env, :organisation => :cloudflare # Choose to use the fallback path instead Rack::JQuery.cdn env, :organisation => false # Raise an error if the organisation doesn't # support this version of jQuery Rack::JQuery.cdn env, :raise => true # Use the unminified version from the CDN Rack::JQuery.cdn env, :debug => true
# File lib/rack/jquery.rb, line 76 def self.cdn( env, options={} ) if env.nil? || env.has_key?(:organisation) fail ArgumentError, "The Rack::JQuery.cdn method needs the Rack environment passed to it, or at the very least, an empty hash." end organisation = options[:organisation] if organisation.nil? # because false is valid organisation = env["rack.jquery.organisation"].nil? ? :media_temple : env["rack.jquery.organisation"] end raise = raiser?( env, options ) unless organisation == false script_src = case organisation when :media_temple CDN::MEDIA_TEMPLE when :microsoft CDN::MICROSOFT when :cloudflare CDN::CLOUDFLARE when :google # meth = raise ? :fail : :warn # send meth, "#{organisation.to_s.gsub('_', ' ').capitalize}'s #{WARNING}" CDN::GOOGLE else CDN::MEDIA_TEMPLE end debug = options.fetch :debug, false script_src = "#{script_src[0..-7]}js" if debug "<script src='#{script_src}'></script>\n#{FALLBACK}" else "<script src='#{FALLBACK_PATH}'></script>" end end
@param [#call] app @param [Hash] options @option options [String] :http_path If you wish the jQuery fallback route to be “/js/jquery-1.9.1.min.js” (or whichever version this is at) then do nothing, that’s the default. If you want the path to be “/assets/javascripts/jquery-1.9.1.min.js” then pass in ‘:http_path => “/assets/javascripts”. @option options [Symbol] :organisation see {Rack::JQuery.cdn} @option options [TrueClass] :raise If one of the CDNs does not support then raise an error if it is chosen. Defaults to false. @example
# The default: use Rack::JQuery # With a different route to the fallback: use Rack::JQuery, :http_path => "/assets/js" # With a default organisation: use Rack::JQuery, :organisation => :cloudflare # Raise if CDN does not support this version of the jQuery library. use Rack::JQuery, :raise => true
# File lib/rack/jquery.rb, line 142 def initialize( app, options={} ) @app, @options = app, DEFAULT_OPTIONS.merge(options) @http_path_to_jquery = ::File.join @options[:http_path], JQUERY_FILE_NAME @raise = @options.fetch :raise, false @organisation = options.fetch :organisation, :media_temple end
Handles the logic for whether to raise or not @note Used by the library, not for public use.
# File lib/rack/jquery.rb, line 49 def self.raiser?( env, options ) (opt = options[:raise]).nil? ? (env["rack.jquery.raise"] || false) : opt end
Public Instance Methods
For thread safety @param (see call
)
# File lib/rack/jquery.rb, line 158 def _call( env ) request = Rack::Request.new(env.dup) env.merge! "rack.jquery.organisation" => @organisation env.merge! "rack.jquery.raise" => @raise if request.path_info == @http_path_to_jquery response = Rack::Response.new # for caching response.headers.merge! caching_headers( JQUERY_FILE_NAME, JQUERY_VERSION_DATE) # There's no need to test if the IF_MODIFIED_SINCE against the release date because the header will only be passed if the file was previously accessed by the requester, and the file is never updated. If it is updated then it is accessed by a different path. if request.env['HTTP_IF_MODIFIED_SINCE'] response.status = 304 else response.status = 200 response.write ::File.read( ::File.expand_path "../../../vendor/assets/javascripts/#{JQUERY_FILE_NAME}", __FILE__) end response.finish else @app.call(env) end end
@param [Hash] env Rack
request environment hash.
# File lib/rack/jquery.rb, line 151 def call( env ) dup._call env end