From d697508e04e0547fb2e583d5e9ae431ec0817ef8 Mon Sep 17 00:00:00 2001 From: Kyrylo Silin Date: Tue, 6 Aug 2019 17:34:15 +0800 Subject: [PATCH] rails/app: detect and attach engine name to routes Fixes #988 (Add support for Rails engine route prefixes) --- CHANGELOG.md | 3 +++ lib/airbrake/rails/app.rb | 25 ++++++++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc0cb2ca7..6463a38d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,9 @@ Airbrake Changelog ### master +* Rails: engine routes are now being marked with the engine name prefix + ([#997](https://github.com/airbrake/airbrake/pull/997)) + ### [v9.4.1][v9.4.1] (August 5, 2019) * Started depending on airbrake-ruby diff --git a/lib/airbrake/rails/app.rb b/lib/airbrake/rails/app.rb index 5cb7839e1..527e9cf2b 100644 --- a/lib/airbrake/rails/app.rb +++ b/lib/airbrake/rails/app.rb @@ -8,26 +8,33 @@ class App Route = Struct.new(:path, :controller, :action) def routes - @routes ||= [*app_routes, *engine_routes].map do |route| - Route.new( - route.path.spec.to_s, - route.defaults[:controller], - route.defaults[:action] - ) + @routes ||= app_routes.merge(engine_routes).flat_map do |(engine_name, routes)| + routes.map { |rails_route| build_route(engine_name, rails_route) } end end private def app_routes - ::Rails.application.routes.routes.routes + # Engine name is nil because this is default (non-engine) routes. + { nil => ::Rails.application.routes.routes.routes } end def engine_routes - ::Rails::Engine.subclasses.flat_map do |engine| - engine.routes.routes.routes + ::Rails::Engine.subclasses.flat_map.with_object({}) do |engine, hash| + next if (eng_routes = engine.routes.routes.routes).none? + + hash["/#{engine.engine_name}"] = eng_routes end end + + def build_route(engine_name, rails_route) + Route.new( + "#{engine_name}#{rails_route.path.spec}", + rails_route.defaults[:controller], + rails_route.defaults[:action] + ) + end end end end