module Tennpipes::Routing::InstanceMethods

Instance methods related to recognizing and processing routes and serving static files.

Public Instance Methods

absolute_url(*args) click to toggle source

Returns absolute url. Calls Sinatra::Helpers#uri to generate protocol version, hostname and port.

@example

absolute_url(:show, :id => 1)  # => http://example.com/show?id=1
absolute_url(:show, 24)        # => https://example.com/admin/show/24
absolute_url('/foo/bar')       # => https://example.com/admin/foo/bar
absolute_url('baz')            # => https://example.com/admin/foo/baz
# File lib/tennpipes-base/application/routing.rb, line 810
def absolute_url(*args)
  url_path = args.shift
  if url_path.is_a?(String) && !url_path.start_with?('/')
    url_path = request.env['PATH_INFO'].rpartition('/').first << '/' << url_path
  end
  uri url(url_path, *args), true, false
end
content_type(type=nil, params={}) click to toggle source

Return the request format, this is useful when we need to respond to a given Content-Type.

@param [Symbol, nil] type

@param [Hash] params

@example

get :index, :provides => :any do
  case content_type
    when :js    then ...
    when :json  then ...
    when :html  then ...
  end
end
Calls superclass method
# File lib/tennpipes-base/application/routing.rb, line 888
def content_type(type=nil, params={})
  return @_content_type unless type
  params.delete(:charset) if type == :json
  super(type, params)
  @_content_type = type
end
current_path(*path_params) click to toggle source

Returns the current path within a route from specified path_params.

# File lib/tennpipes-base/application/routing.rb, line 825
def current_path(*path_params)
  if path_params.last.is_a?(Hash)
    path_params[-1] = params.merge(path_params[-1].with_indifferent_access)
  else
    path_params << params
  end

  path_params[-1] = path_params[-1].symbolize_keys
  @route.path(*path_params)
end
recognize_path(path) click to toggle source
# File lib/tennpipes-base/application/routing.rb, line 818
def recognize_path(path)
  settings.recognize_path(path)
end
route() click to toggle source

Returns the current route

@example

-if route.controller == :press
  %li=show_article
# File lib/tennpipes-base/application/routing.rb, line 843
def route
  @route
end
static!(options = {}) click to toggle source

Method for deliver static files.

# File lib/tennpipes-base/application/routing.rb, line 863
def static!(options = {})
  if path = static_file?(request.path_info)
    env['sinatra.static_file'] = path
    cache_control(*settings.static_cache_control) if settings.static_cache_control?
    send_file(path, options)
  end
end
static_file?(path_info) click to toggle source

This is mostly just a helper so request.path_info isn't changed when serving files from the public directory.

# File lib/tennpipes-base/application/routing.rb, line 851
def static_file?(path_info)
  return unless public_dir = settings.public_folder
  public_dir = File.expand_path(public_dir)
  path = File.expand_path(public_dir + unescape(path_info))
  return unless path.start_with?(public_dir)
  return unless File.file?(path)
  return path
end
url(*args) click to toggle source

Instance method for URL generation.

@example

url(:show, :id => 1)
url(:show, :name => :test)
url(:show, 1)
url("/foo", false, false)

@see Tennpipes::Routing::ClassMethods#url

Calls superclass method
# File lib/tennpipes-base/application/routing.rb, line 784
def url(*args)
  if args.first.is_a?(String)
    url_path = settings.rebase_url(args.shift)
    if args.empty?
      url_path
    else
      # Delegate sinatra-style urls to Sinatra. Ex: url("/foo", false, false)
      # http://www.sinatrarb.com/intro#Generating%20URLs
      super url_path, *args
    end
  else
    # Delegate to Tennpipes named route URL generation.
    settings.url(*args)
  end
end
Also aliased as: url_for
url_for(*args)
Alias for: url

Private Instance Methods

captures_from_params(params) click to toggle source
# File lib/tennpipes-base/application/routing.rb, line 993
def captures_from_params(params)
  if params[:captures].instance_of?(Array) && params[:captures].present?
    params.delete(:captures)
  else
    params.values_at(*route.matcher.names).flatten
  end
end
dispatch!() click to toggle source
# File lib/tennpipes-base/application/routing.rb, line 922
def dispatch!
  invoke do
    static! if settings.static? && (request.get? || request.head?)
    route!
  end
rescue ::Exception => boom
  filter! :before if boom.kind_of? ::Sinatra::NotFound
  invoke { @boom_handled = handle_exception!(boom) }
ensure
  @boom_handled or begin
    filter! :after  unless env['sinatra.static_file']
  rescue ::Exception => boom
    invoke { handle_exception!(boom) } unless @env['sinatra.error']
  end
end
filter!(type, base=settings) click to toggle source
# File lib/tennpipes-base/application/routing.rb, line 918
def filter!(type, base=settings)
  base.filters[type].each { |block| instance_eval(&block) }
end
invoke_route(route, params, first_time) click to toggle source
# File lib/tennpipes-base/application/routing.rb, line 969
def invoke_route(route, params, first_time)
  @_response_buffer = nil
  @route = request.route_obj = route
  captured_params = captures_from_params(params)

  @params.merge!(params) if params.kind_of?(Hash)
  @params.merge!(:captures => captured_params) if !captured_params.empty? && route.path.is_a?(Regexp)

  filter! :before if first_time

  catch(:pass) do
    begin
        (route.before_filters - settings.filters[:before]).each{|block| instance_eval(&block) }
        @layout = route.use_layout if route.use_layout
        route.custom_conditions.each {|block| pass if block.bind(self).call == false }
        route_response = route.block[self, captured_params]
        @_response_buffer = route_response.instance_of?(Array) ? route_response.last : route_response
        halt(route_response)
    ensure
      (route.after_filters - settings.filters[:after]).each {|block| instance_eval(&block) }
    end
  end
end
mime_symbol(media_type) click to toggle source
# File lib/tennpipes-base/application/routing.rb, line 914
def mime_symbol(media_type)
  ::Rack::Mime::MIME_TYPES.key(media_type).sub(/\./,'').to_sym
end
provides_any?(formats) click to toggle source
# File lib/tennpipes-base/application/routing.rb, line 897
def provides_any?(formats)
  accepted_format = formats.first
  type = accepted_format ? mime_symbol(accepted_format) : :html
  content_type(CONTENT_TYPE_ALIASES[type] || type, :charset => 'utf-8')
end
provides_format?(types, format) click to toggle source
# File lib/tennpipes-base/application/routing.rb, line 903
def provides_format?(types, format)
  if ([:any, format] & types).empty?
    # Per rfc2616-sec14:
    # Answer with 406 if accept is given but types to not match any provided type.
    halt 406 if settings.respond_to?(:treat_format_as_accept) && settings.treat_format_as_accept
    false
  else
    content_type(format || :html, :charset => 'utf-8')
  end
end
route!(base = settings, pass_block = nil) click to toggle source
# File lib/tennpipes-base/application/routing.rb, line 938
def route!(base = settings, pass_block = nil)
  Thread.current['tennpipes.instance'] = self
  first_time = true

  routes = base.compiled_router.call(@request) do |route, params|
    next if route.user_agent && !(route.user_agent =~ @request.user_agent)
    original_params, parent_layout = @params.dup, @layout
    returned_pass_block = invoke_route(route, params, first_time)
    pass_block = returned_pass_block if returned_pass_block
    first_time = false if first_time
    @params, @layout = original_params, parent_layout
  end

  if routes.present?
    verb = request.request_method
    candidacies, allows = routes.partition{|route| route.verb == verb }
    if candidacies.empty?
      response["Allows"] = allows.map(&:verb).join(", ")
      halt 405
    end
  end

  if base.superclass.respond_to?(:router)
    route!(base.superclass, pass_block)
    return
  end

  route_eval(&pass_block) if pass_block
  route_missing
end