aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/rails/info_controller.rb
diff options
context:
space:
mode:
Diffstat (limited to 'railties/lib/rails/info_controller.rb')
-rw-r--r--railties/lib/rails/info_controller.rb54
1 files changed, 54 insertions, 0 deletions
diff --git a/railties/lib/rails/info_controller.rb b/railties/lib/rails/info_controller.rb
new file mode 100644
index 0000000000..14459623ac
--- /dev/null
+++ b/railties/lib/rails/info_controller.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+require "rails/application_controller"
+require "action_dispatch/routing/inspector"
+
+class Rails::InfoController < Rails::ApplicationController # :nodoc:
+ prepend_view_path ActionDispatch::DebugView::RESCUES_TEMPLATE_PATH
+ layout -> { request.xhr? ? false : "application" }
+
+ before_action :require_local!
+
+ def index
+ redirect_to action: :routes
+ end
+
+ def properties
+ respond_to do |format|
+ format.html do
+ @info = Rails::Info.to_html
+ @page_title = "Properties"
+ end
+
+ format.json do
+ render json: Rails::Info.to_json
+ end
+ end
+ end
+
+ def routes
+ if path = params[:path]
+ path = URI.parser.escape path
+ normalized_path = with_leading_slash path
+ render json: {
+ exact: match_route { |it| it.match normalized_path },
+ fuzzy: match_route { |it| it.spec.to_s.match path }
+ }
+ else
+ @routes_inspector = ActionDispatch::Routing::RoutesInspector.new(_routes.routes)
+ @page_title = "Routes"
+ end
+ end
+
+ private
+
+ def match_route
+ _routes.routes.select { |route|
+ yield route.path
+ }.map { |route| route.path.spec.to_s }
+ end
+
+ def with_leading_slash(path)
+ ("/" + path).squeeze("/")
+ end
+end