@@ -69,8 +69,14 @@ def extract_request_attributes(request, example)
6969 raw_path_params = request . path_parameters
7070 path = request . path
7171 if rails?
72- route = find_rails_route ( request )
73- path = route . path . spec . to_s . delete_suffix ( '(.:format)' )
72+ # Reverse the destructive modification by Rails https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/journey/router.rb#L33-L41
73+ fixed_request = request . dup
74+ fixed_request . path_info = File . join ( request . script_name , request . path_info ) if request . script_name . present?
75+
76+ route , path = find_rails_route ( fixed_request )
77+ raise "No route matched for #{ fixed_request . request_method } #{ fixed_request . path_info } " if route . nil?
78+
79+ path = path . delete_suffix ( '(.:format)' )
7480 summary ||= route . requirements [ :action ]
7581 tags ||= [ route . requirements [ :controller ] &.classify ] . compact
7682 # :controller and :action always exist. :format is added when routes is configured as such.
@@ -102,21 +108,18 @@ def rack_test?(context)
102108 end
103109
104110 # @param [ActionDispatch::Request] request
105- def find_rails_route ( request , app : Rails . application , fix_path : true )
106- # Reverse the destructive modification by Rails https://github.com/rails/rails/blob/v6.0.3.4/actionpack/lib/action_dispatch/journey/router.rb#L33-L41
107- if fix_path && !request . script_name . empty?
108- request = request . dup
109- request . path_info = File . join ( request . script_name , request . path_info )
110- end
111-
111+ def find_rails_route ( request , app : Rails . application , path_prefix : '' )
112112 app . routes . router . recognize ( request ) do |route |
113+ path = route . path . spec . to_s
113114 if route . app . matches? ( request )
114- return find_rails_route ( request , app : route . app . app , fix_path : false ) if route . app . engine?
115-
116- return route
115+ if route . app . engine?
116+ route , path = find_rails_route ( request , app : route . app . app , path_prefix : path )
117+ next if route . nil?
118+ end
119+ return [ route , path_prefix + path ]
117120 end
118121 end
119- raise "No route matched for #{ request . request_method } #{ request . path_info } "
122+ nil
120123 end
121124
122125 # workaround to get real request parameters
0 commit comments