Ваши маршруты в обратном порядке; сначала вы хотите более конкретные маршруты, а потом более общие маршруты. Rails выберет первый маршрут, который он может использовать для соответствия заданному набору параметров.
ActionController::Routing::Routes.draw do |map|
map.connect ':controller/:action/:genus/:species/:id'
map.connect ':controller/:action/:genus/:id'
map.connect ':controller/:action/:id'
map.connect ':controller/:action'
map.connect ':controller', :action => 'index'
map.root :controller => 'main', :action => 'index'
end
Тем не менее, вы можете использовать именованные маршруты для этого очень легко.
ActionController::Routing::Routes.draw do |map|
map.with_options(:path_prefix => ":controller/:action") do |con|
con.species ":genus/:species/:id"
con.genus ":genus/:id"
con.connect ":id"
con.connect ""
end
end
Который дает вам следующие маршруты:
species /:controller/:action/:genus/:species/:id
genus /:controller/:action/:genus/:id
/:controller/:action/:id
/:controller/:action
Тогда вы можете просто использовать:
<%=genus_path("main", "test", 42, 1) %>
Чтобы получить:
"/main/test/42/1"