123456789_123456789_123456789_123456789_123456789_

Class: ActionDispatch::PublicExceptions

Relationships & Source Files
Inherits: Object
Defined in: actionpack/lib/action_dispatch/middleware/public_exceptions.rb

Overview

When called, this middleware renders an error page. By default if an HTML response is expected it will render static error pages from the /public directory. For example when this middleware receives a 500 response it will render the template found in /public/500.html. If an internationalized locale is set, this middleware will attempt to render the template in /public/500..html. If an internationalized template is not found it will fall back on /public/500.html.

When a request with a content type other than HTML is made, this middleware will attempt to convert error information into the appropriate response type.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(public_path) ⇒ PublicExceptions

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/middleware/public_exceptions.rb', line 21

def initialize(public_path)
  @public_path = public_path
end

Instance Attribute Details

#public_path (rw)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/middleware/public_exceptions.rb', line 19

attr_accessor :public_path

Instance Method Details

#call(env)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/middleware/public_exceptions.rb', line 25

def call(env)
  request      = ActionDispatch::Request.new(env)
  status       = request.path_info[1..-1].to_i
  begin
    content_type = request.formats.first
  rescue ActionDispatch::Http::MimeNegotiation::InvalidType
    content_type = Mime[:text]
  end
  body = { status: status, error: Rack::Utils::HTTP_STATUS_CODES.fetch(status, Rack::Utils::HTTP_STATUS_CODES[500]) }

  render(status, content_type, body)
end

#render(status, content_type, body) (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/middleware/public_exceptions.rb', line 39

def render(status, content_type, body)
  format = "to_#{content_type.to_sym}" if content_type
  if format && body.respond_to?(format)
    render_format(status, content_type, body.public_send(format))
  else
    render_html(status)
  end
end

#render_format(status, content_type, body) (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/middleware/public_exceptions.rb', line 48

def render_format(status, content_type, body)
  [status, { Rack::CONTENT_TYPE => "#{content_type}; charset=#{ActionDispatch::Response.default_charset}",
            Rack::CONTENT_LENGTH => body.bytesize.to_s }, [body]]
end

#render_html(status) (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/middleware/public_exceptions.rb', line 53

def render_html(status)
  path = "#{public_path}/#{status}.#{I18n.locale}.html"
  path = "#{public_path}/#{status}.html" unless (found = File.exist?(path))

  if found || File.exist?(path)
    render_format(status, "text/html", File.read(path))
  else
    [404, { Constants::X_CASCADE => "pass" }, []]
  end
end