Module: KineticCafe::ErrorHandler

Extended by:
ActiveSupport::Concern
Defined in:
app/controllers/concerns/kinetic_cafe/error_handler.rb

Overview

A controller concern for KineticCafe::Error that rescues from KineticCafe::Error using #kinetic_cafe_error_handler. This handler can be redefined on a per-controller basis.

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#kinetic_cafe_error_handler(error) ⇒ Object

This method is called with error when Rails catches a KineticCafe::Error descendant. It logs the message and its cause as severity error. After logging as error, it will render to HTML or JSON. The received error is logged using the value of #kinetic_cafe_error_handler_log_locale.

HTML is rendered with #kinetic_cafe_error_render_html. JSON is rendered with #kinetic_cafe_error_render_json. Either of these can be overridden in controllers for different behaviour.



43
44
45
46
47
48
49
50
51
52
53
54
# File 'app/controllers/concerns/kinetic_cafe/error_handler.rb', line 43

def kinetic_cafe_error_handler(error)
  kinetic_cafe_error_log_error(error)

  respond_to do |format|
    format.html do
      kinetic_cafe_error_render_html(error)
    end
    format.json do
      kinetic_cafe_error_render_json(error)
    end
  end
end

#kinetic_cafe_error_log_error(error) ⇒ Object

Write the provided error to the Rails log using the value of #kinetic_cafe_error_handler_log_locale. If the error has a cause, log that as well.



86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'app/controllers/concerns/kinetic_cafe/error_handler.rb', line 86

def kinetic_cafe_error_log_error(error)
  locale = self.class.kinetic_cafe_error_handler_log_locale
  Rails.logger.error(error.message(locale))

  return unless error.cause

  Rails.logger.error(
    t(
      'kinetic_cafe_error.cause',
      message: error.cause.message,
      locale: locale
    )
  )
end

#kinetic_cafe_error_render_html(error) ⇒ Object

Render the error as HTML. Uses the template kinetic_cafe_error/page with error passed as a local of the same name. The render status is set to error.status.



59
60
61
62
# File 'app/controllers/concerns/kinetic_cafe/error_handler.rb', line 59

def kinetic_cafe_error_render_html(error)
  render template: 'kinetic_cafe_error/page', locals: { error: error },
    status: error.status
end

#kinetic_cafe_error_render_json(error) ⇒ Object

Render the error as JSON. If it is KineticCafe::Error#header_only?, only a head of the error.status is returned. Otherwise, the render is done with KineticCafe::Error#json_result.

If you are overriding this because you want to add or change #json_result, use #error_result as the value to the json parameter.

def kinetic_cafe_error_render_json(error)
  render status: error.status, layout: false, json: error.error_result,
    content_type: 'application/hal+json'
end


75
76
77
78
79
80
81
# File 'app/controllers/concerns/kinetic_cafe/error_handler.rb', line 75

def kinetic_cafe_error_render_json(error)
  if error.header_only?
    head error.status
  else
    render error.json_result
  end
end