class Redmine::Reporting::Rails::Middleware

Rack middleware for Rails applications. Any errors raised by the upstream application will be send to Redmine and re-raised.

Public Class Methods

new(app) click to toggle source
# File lib/redmine/reporting/rails/middleware.rb, line 7
def initialize(app)
  @app = app
end

Public Instance Methods

call(env) click to toggle source
# File lib/redmine/reporting/rails/middleware.rb, line 11
def call(env)
  begin
    response = @app.call(env)
  rescue Exception => exception
    env['redmine_reporting.reference_id'] = redmine_report(env, exception)
    raise exception
  end

  if framework_exception = env['action_dispatch.exception']
    env['redmine_reporting.reference_id'] = redmine_report(env, framework_exception)
  end

  response
end

Private Instance Methods

redmine_report(env, exception) click to toggle source
# File lib/redmine/reporting/rails/middleware.rb, line 28
def redmine_report(env, exception)
  return unless desc = env["action_controller.instance"].try(:redmine_reporting_request_data)

  Redmine::Reporting.report(exception) do
    notes do
      section("URL: #{desc[:url]} (#{desc[:params][:controller]}##{desc[:params][:action]})", '')
      section('Parameters') do
        output(desc[:params].select{|k,v| ![:controller, :action].include?(k)}.collect{|k,v| "* *#{k}:* #{v}"}.join("\n"))
      end
      section('Session') do
        output(desc[:session].collect{|k,v| "* *#{k}:* #{v}"}.join("\n"))
      end
    end
  end
end
request_data(env) click to toggle source
# File lib/redmine/reporting/rails/middleware.rb, line 44
def request_data(env)
  env["action_controller.instance"].try(:redmine_reporting_request_data) || {:rack_env => env}
end