Из того, что я собрал из вашего поста, вы хотите URL, как
http://domain.com/programs/search/leader/12345
для получения хэша params типа
:params => { programs => {:type => "search", :leader_id => "12345"}}
Я не думаю, что это можно сделать. Насколько я могу сказать, вы не можете создать вложенный хеш из named_route. Есть обходные пути, но каждый из них требует какой-либо модификации контроллера.
Мне кажется, это наименее навязчивое решение:
Сначала настройте более простой именованный маршрут,
map.programs 'programs/:program_type/:program_leader_id',
:controller=>..., :action=>...
Затем я хотел бы сделать обертку link_to или url_for доступной в качестве помощника, чтобы ей можно было передать программный объект и сделать правильный URL-адрес.
def link_to_programs name, prog
link_to name, programs_url(prog,
:programs =>{:program_type => prog[:type], :prog[:program_leader_id]})
end
Тогда мне нужно было бы каким-то образом обмануть контроллер, заставив его думать, что ему был передан более глубокий хэш params.
В программном_контроллере:
def fix_bad_params
params.merge!({:programs => {:type => params[:program_type],
:leader_id => params[:program_leader_id])
end
before_filter :fix_bad_params, :only => :action_in_named_route
NB. Упомянутая мной оболочка link_to является неполной. Я использовал ее для простой демонстрации. Если вы планируете передать ему другие параметры или даже использовать его для других целей (например, link_to (@project), вам нужно будет переписать его. Посмотрите на источник link_to, чтобы понять, как лучше всего это сделать это.