2010-02-17 2 views
5

Есть более простой способ написания этого:Рельсы, маршрутизации много именованных маршрутов к одному действию

map.old_site_cusom_packages '/customs_packages_options.html', :controller => :public, :action => :redirect_to_home 
    map.old_corporate '/corporate.html', :controller => :public, :action => :redirect_to_home 
    map.old_track '/track.html', :controller => :public, :action => :redirect_to_home 
    map.old_links '/links.html', :controller => :public, :action => :redirect_to_home 
    map.old_contact '/contact.html', :controller => :public, :action => :redirect_to_home 

Я хочу послать много именованных маршрутов в одном действии на одном контроллере, я убедившись, что URL, осталось от старого сайта перенаправить на правильные страницы.

Cheers.

ответ

2

Вы всегда можете написать многоцелевой маршрут с регулярным выражением а для захвата деталей:

old_content_names_regexp = Regexp.new(%w[ 
    customs_packages_options 
    corporate 
    track 
    links 
    contact 
].join('|')) 

map.old_content '/:page_name.html', 
    :controller => :public, 
    :action => :redirect_to_home, 
    :requirements => { 
    :page_name => old_content_names_regexp 
    } 

Это должно захватить определенные страницы и перенаправить их соответствующим образом , Более надежное решение состоит в том, чтобы иметь какую-то таблицу поиска в базе данных, которая проверяется перед обслуживанием любого содержимого или страниц с 404 типами.

Редактировать: Для именованных маршрутов, это легко изменение:

%w[ 
    customs_packages_options 
    corporate 
    track 
    links 
    contact 
].each do |old_path| 
    map.send(:"old_#{old_path}", 
    "/#{old_path}.html", 
    :controller => :public, 
    :action => :redirect_to_home, 
) 
end 

В большинстве случаев старые маршруты могут быть переписаны с использованием единственного числа унаследованный маршрут, указанный первым. Также лучше держать таблицу маршрутизации максимально возможной. Второй метод - скорее костыль, чтобы попытаться соединить старые маршруты.

+0

... Совершенная и сделать его еще более емким вам не нужно, чтобы создать объект регулярного выражения, вы можете просто сделать ... old_content_names_regexp =/customs_packages_options | дома | дорожки/ – Smickie

+1

Хотя в чистом виде, это не на самом деле делать то, что требуется. Он предоставляет один и тот же маршрут, который параметризуется с помощью 'page_name'. Вопрос касался многих названных маршрутов. –

+0

Он не предоставляет одинаковые функции именованных маршрутов, но их легко добавить. – tadman

7

Используйте with_options метод:

map.with_options :controller => :public, :action => :redirect_to_home do |p| 
    p.old_site_custom_packages '/customs_packages_options.html' 
    p.old_corporate '/corporate.html' 
    p.old_track '/track.html' 
    p.old_links '/links.html' 
    p.old_contact '/contact.html' 
end