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.<locale>.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 19

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 17

attr_accessor :public_path

Instance Method Details

#call(env)

[ GitHub ]

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

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 37

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 46

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 51

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