Problem with recognize_path

Hello,

I am experiencing a weird problem on one of the 3 test servers I’m
using:
There is a controller named admin/statistics and I am trying to
access /admin/statistics
The matching rule is: map.connect ‘:controller/:action/:id’
On 2 of the 3 servers, recognize_path correctly matches to
Parameters: {“action”=>“index”, “controller”=>“admin/statistics”}
But on the 3rd server here is what happens:
Parameters: {“action”=>“statistics”, “controller”=>“admin”}
Of course that action does not exist, and it fails.

Any idea of what could be causing that problem?

Thanks,

Paul Cahier

some more information
I ran the following function to search more detail:

#To show all the routes and their recognition
ActionController::Routing::Routes.routes.each do |route|
puts route
puts route.write_recognition
puts
end

And to my great surprise, despite exactly the same source, rails
version, ruby version, there was a difference:
In the “bad” server:
if (match = /\A/(?i-:(rails_info|rails/info|public|rest|admin|admin/
teams|admin/keywords|admin/photos|admin/car_situations|admin/
circuits|admin/statistics|admin/update|admin/communication|admin/
users|admin/dump|admin/editor|admin/photo_types|admin/updates|admin
/photo_styles|admin/monitoring|admin/database|admin/jobs|admin/
people|admin/sponsors|admin/sessions|admin/import|admin/customers|
admin/synchronize|admin/grand_prix|admin/photo_angles|admin/races|
admin/posts|admin/settings|admin/emotions))(?:/?\Z|/([^/;.,?]+)
(?:/?\Z|/([^/;.,?]+)/?))\Z/.match(path))

In the “good” servers:
if (match = /\A/(?i-:(rails_info|rails/info|public|admin/teams|admin
/keywords|admin/photos|admin/car_situations|admin/circuits|admin/
statistics|admin/update|admin/communication|admin/users|admin/dump|
admin/editor|admin/photo_types|admin/updates|admin/photo_styles|
admin/jobs|admin/monitoring|admin/database|admin/people|admin/
sponsors|admin/sessions|admin/import|admin/customers|admin/
synchronize|admin/grand_prix|admin/photo_angles|admin/races|admin/
posts|admin/settings|admin/emotions|rest|admin))(?:/?\Z|/([^/;.,?]
+)(?:/?\Z|/([^/;.,?]+)/?))\Z/.match(path))

In other word rest|admin is added on the non-working servers too
early…
“Sounds like a print the node before the subnodes”

Any hints would be lovely,

Paul Cahier

Problem was solved, and comes from an error in actionpack:
in /actionpack-1.13.3/lib/action_controller/routing.rb line 290
Dir["#{load_path}//*_controller.rb"].collect is not a constant order
depending on the file system, and apparently not the good order for
checking for possible routings(since the regular expression to match
routings is based on the order given by this).
A simple fix is to add a sort:
Dir["#{load_path}/
/*_controller.rb"].sort.collect

After that everything works fine, and the order will be constant
amongst filesystems.

Best Regards,

Paul-Kenji Cahier