/
info_controller.rb
63 lines (49 loc) · 1.81 KB
/
info_controller.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 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_PATHS
layout -> { request.xhr? ? false : "application" }
before_action :require_local!
def index
redirect_to action: :routes
end
def properties
@info = Rails::Info.to_html
@page_title = "Properties"
end
def routes
if query = params[:query]
query = URI::DEFAULT_PARSER.escape query
render json: {
exact: matching_routes(query: query, exact_match: true),
fuzzy: matching_routes(query: query, exact_match: false)
}
else
@routes_inspector = ActionDispatch::Routing::RoutesInspector.new(_routes.routes)
@page_title = "Routes"
end
end
private
def matching_routes(query:, exact_match:)
return [] if query.blank?
normalized_path = ("/" + query).squeeze("/")
query_without_url_or_path_suffix = query.gsub(/(\w)(_path$)/, '\1').gsub(/(\w)(_url$)/, '\1')
_routes.routes.filter_map do |route|
route_wrapper = ActionDispatch::Routing::RouteWrapper.new(route)
if exact_match
match = route.path.match(normalized_path)
match ||= (query_without_url_or_path_suffix === route_wrapper.name)
else
match = route_wrapper.path.match(query)
match ||= route_wrapper.name.include?(query_without_url_or_path_suffix)
end
match ||= (query === route_wrapper.verb)
unless match
controller_action = URI::DEFAULT_PARSER.escape(route_wrapper.reqs)
match = exact_match ? (query === controller_action) : controller_action.include?(query)
end
route_wrapper.path if match
end
end
end