Methods

Sinatra::RespondTo

Constants

Version

Public Class Methods

registered(app) click to toggle source
# File lib/sinatra/respond_to.rb, line 19
def self.registered(app)
  app.helpers RespondTo::Helpers

  app.set :default_content, :html
  app.set :assume_xhr_is_js, true

  # We remove the trailing extension so routes
  # don't have to be of the style
  #
  #   get '/resouce.:format'
  #
  # They can instead be of the style
  #
  #   get '/resource'
  #
  # and the format will automatically be available in <tt>format</tt>
  app.before do
    # Let through sinatra image urls in development
    next if self.class.development? && request.path_info =~ %{/__sinatra__/.*?.png}

    unless settings.static? && settings.public_folder? && (request.get? || request.head?) && static_file?(request.path_info)
      if request.params.has_key? 'format'
        format params['format']
      else
        # Sinatra relies on a side-effect from path_info= to
        # determine its routes. A direct string change (e.g., sub!)
        # would bypass that -- and fail to have the effect we're looking
        # for.
        request.path_info = request.path_info.sub %{\.([^\./]+)$}, ''

        format $1 || (request.xhr? && settings.assume_xhr_is_js? ? :js : settings.default_content)
      end
    end
  end

  app.configure :development do |dev|
    dev.error UnhandledFormat do
      content_type :html, :charset => 'utf-8'

      (          <!DOCTYPE html>          <html>          <head>            <style type="text/css">            body { text-align:center;font-family:helvetica,arial;font-size:22px;              color:#888;margin:20px}            #c {margin:0 auto;width:500px;text-align:left}            </style>          </head>          <body>            <h2>Sinatra doesn't know this ditty.</h2>            <img src='/__sinatra__/404.png'>            <div id="c">              Try this:              <pre>#{request.request_method.downcase} '#{request.path_info}' do\n  respond_to do |wants|\n    wants.#{format} { "Hello World" }\n  end\nend</pre>            </div>          </body>          </html>).gsub(/^ {10}/, '')
    end

    dev.error MissingTemplate do
      content_type :html, :charset => 'utf-8'
      response.status = 500

      engine = request.env['sinatra.error'].message.split('.').last
      engine = 'haml' unless ['haml', 'builder', 'erb'].include? engine

      path = File.basename(request.path_info)
      path = "root" if path.nil? || path.empty?

      format = engine == 'builder' ? 'xml' : 'html'

      layout = case engine
               when 'haml' then "!!!\n%html\n  %body= yield"
               when 'erb' then "<html>\n  <body>\n    <%= yield %>\n  </body>\n</html>"
               when 'builder' then "xml << yield"
               end

      layout = "<small>app.#{format}.#{engine}</small>\n<pre>#{escape_html(layout)}</pre>"

      (          <!DOCTYPE html>          <html>          <head>            <style type="text/css">            body { text-align:center;font-family:helvetica,arial;font-size:22px;              color:#888;margin:20px}            #c {margin:0 auto;width:500px;text-align:left;}            small {float:right;clear:both;}            pre {clear:both;}            </style>          </head>          <body>            <h2>Sinatra can't find #{request.env['sinatra.error'].message}</h2>            <img src='/__sinatra__/500.png'>            <div id="c">              Try this:<br />              #{layout}              <small>#{path}.#{format}.#{engine}</small>              <pre>Hello World!</pre>              <small>application.rb</small>              <pre>#{request.request_method.downcase} '#{request.path_info}' do\n  respond_to do |wants|\n    wants.#{engine == 'builder' ? 'xml' : 'html'} { #{engine} :#{path}#{",\n#{' '*32}layout => :app" if layout} }\n  end\nend</pre>            </div>          </body>          </html>).gsub(/^ {10}/, '')
    end
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.