class Airbrake::Rack::RouteFilter

Adds route slugs to context/route. @since v7.5.0

Attributes

weight[R]

Public Class Methods

new() click to toggle source
# File lib/airbrake/rack/route_filter.rb, line 8
def initialize
  @weight = 100
end

Public Instance Methods

call(notice) click to toggle source
# File lib/airbrake/rack/route_filter.rb, line 12
def call(notice)
  return unless (request = notice.stash[:rack_request])

  notice[:context][:route] =
    if action_dispatch_request?(request)
      rails_route(request)
    elsif sinatra_request?(request)
      sinatra_route(request)
    end
end

Private Instance Methods

action_dispatch_request?(request) click to toggle source
# File lib/airbrake/rack/route_filter.rb, line 43
def action_dispatch_request?(request)
  defined?(ActionDispatch::Request) &&
    request.instance_of?(ActionDispatch::Request)
end
rails_route(request) click to toggle source
# File lib/airbrake/rack/route_filter.rb, line 25
def rails_route(request)
  ::Rails.application.routes.router.recognize(request) do |route, _parameters|
    # Rails can recognize multiple routes for the given request. For
    # example, if we visit /users/2/edit, then Rails sees these routes:
    #   * "/users/:id/edit(.:format)"
    #   *  "/"
    #
    # We return the first route as, what it seems, the most optimal
    # approach.
    return route.path.spec.to_s
  end
end
sinatra_request?(request) click to toggle source
# File lib/airbrake/rack/route_filter.rb, line 48
def sinatra_request?(request)
  defined?(Sinatra::Request) && request.instance_of?(Sinatra::Request)
end
sinatra_route(request) click to toggle source
# File lib/airbrake/rack/route_filter.rb, line 38
def sinatra_route(request)
  return unless (route = request.env['sinatra.route'])
  route.split(' ').drop(1).join(' ')
end