class Locomotive::Wagon::Middlewares::ErrorPage

Display a nice page error

Public Instance Methods

_call() click to toggle source
# File lib/locomotive/wagon/middlewares/error_page.rb, line 14
def _call
  begin
    self.next
  rescue StandardError => error
    @error      = error
    @file_name  = get_error_file_name(error)

    log_error
    render_error_page
  end
end

Private Instance Methods

get_error_file_name(error) click to toggle source
# File lib/locomotive/wagon/middlewares/error_page.rb, line 33
def get_error_file_name(error)
  return nil unless error.respond_to?(:template_name)

  site_path = Locomotive::Steam.configuration.adapter[:path]

  case error.template_name
  when /^(snippets|sections)--(.+)$/
    File.join(site_path, "app/views/#{$1}/#{$2}.liquid")
  else
    error.template_name
  end
end
log_error() click to toggle source
# File lib/locomotive/wagon/middlewares/error_page.rb, line 28
def log_error
  log "Error: #{@error.message}".red
  log @error.backtrace.join("\n")
end
render_error_page() click to toggle source
# File lib/locomotive/wagon/middlewares/error_page.rb, line 46
def render_error_page
  _template = ERB.new(template, nil, '-')
  render_response(_template.result(binding))
rescue Exception => e
  puts e.inspect
  'Unknown error'
end
template() click to toggle source
# File lib/locomotive/wagon/middlewares/error_page.rb, line 54
      def template
        %{
<DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
      <title>Wagon - Rendering error</title>
      <link href="https://fonts.googleapis.com/css?family=Muli:300,400,700" rel="stylesheet" />
      <style>
        body { margin: 0px; padding: 0px; font-family: 'Muli', sans-serif; }
        div { padding: 20px; }
        h1 {
          margin: 0px;
          padding: 20px 0px;
          text-align: center;
          color: #fff;
          background: #E1535E;
        }
        h2 {
          font-size: 40px;
          text-align: center;
        }
        h3 {
          text-transform: uppercase;
          font-weight: normal;
        }
        h3 strong { font-weight: bold; text-transform: none; }
        p {
          font-weight: 300;
          line-height: 22px;
          margin: 20px 20px 30px;
        }
        pre {
          margin: 20px 20px 30px;
          padding: 20px 0px 20px 0px;
          border-left: 4px solid #CACACA;
          background: #FAFAFA;
          box-sizing: border-box;
          line-height: 20px;
        }
        pre strong {
          margin-right: 20px;
        }

        .backtrace-title {
          cursor: pointer;
        }

        .backtrace-title {
          display: block;
        }

        .backtrace.hidden {
          display: none;
        }
      </style>
      <script>
        document.addEventListener('DOMContentLoaded', function() {
          var el = document.querySelector('h3.backtrace-title');
          el.onclick = function() {
            document.querySelector('.backtrace').classList.toggle('hidden');
          }
        });
      </script>
    </head>

    <body>
      <h1>Arrrghhhh, we could not render your page</h1>

      <div>
        <h2><%= @error.message %></h2>

        <% if @file_name %>
          <h3>File</h3>
          <p><%= @file_name %></p>
        <% end %>

        <% if @error.respond_to?(:action) %>
          <h3>Action</h3>
          <p><%= @error.action %></p>
        <% end %>

        <% if @error.respond_to?(:code_lines) %>
          <h3>Code</h3>
          <pre>
  <% @error.code_lines.each do |(line, statement)| -%>
  <strong><%= line %></strong> <%= ERB::Util.html_escape(statement) %>
  <% end -%>
          </pre>
        <% else %>
          <p><i>No code</i></p>
        <% end %>

        <h3 class="backtrace-title">Backtrace <small>(click here to display it)</small></h3>
        <p class="backtrace hidden"><%= @error.backtrace.join("<br/>") %></p>
      </div>

    </body>
  </html>}
      end