Class: ErrorPages

Inherits:
Object
  • Object
show all
Defined in:
lib/yodel/middleware/error_pages.rb

Constant Summary collapse

TEMPLATE =
"  <!DOCTYPE html>\n  <html>\n    <head>\n      <title><%= error_code %> - <%= error %></title>\n      <link rel=\"stylesheet\" href=\"/core/css/core.css\" type=\"text/css\">\n    </head>\n    <body>\n      <article id=\"modal\">\n        <header>\n          <h1>yodel</h1>\n          <div id=\"lip\"></div>\n        </header>\n        <h1><%= error %></h1>\n        <p><%= description %></p>\n      </article>\n    </body>\n  </html>\n"

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ ErrorPages

Returns a new instance of ErrorPages.



2
3
4
# File 'lib/yodel/middleware/error_pages.rb', line 2

def initialize(app)
  @app = app
end

Instance Method Details

#call(env) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/yodel/middleware/error_pages.rb', line 6

def call(env)
  status, headers, response = @app.call(env)
  if status.to_i >= 400 && status.to_i != 401
    return render_error_page(status, response)
  else
    return [status, headers, response]
  end
rescue
  Yodel.config.logger.warn $!.to_s
  if Yodel.env.production?
    if $!.is_a?(DomainNotFound)
      return render_error_page(404, ['No site has been set up at this address'])
    else
      return render_error_page(500, [])
    end
  else
    if $!.respond_to?(:error) && $!.respond_to?(:description)
      return render_error_page(404, $!.error, $!.description)
    else
      raise $!
    end
  end
end

#render_error_page(error_code, response, description = nil) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/yodel/middleware/error_pages.rb', line 30

def render_error_page(error_code, response, description=nil)
  template = Ember::Template.new(TEMPLATE)
  if response.present? && response.respond_to?(:length) && response.length > 0
    components = []
    response.each {|component| components << component}
    error = components.join
  elsif error_code == 403
    error = "Unauthorised"
  else
    error = "We're sorry, something went wrong."
  end
  if description.nil?
    if error_code == 404
      description = "You may have mistyped the address or the page may have moved."
    elsif error_code == 403
      description = "You must log in before performing this action."
    else
      description = "We've been notified about this issue and we'll take a look at it shortly."
    end
  end
  [error_code, {'Content-Type' => 'text/html'}, [template.render(binding)]]
end