2010-02-17 22 views
5

Czy istnieje prostszy sposób pisania to:Rails, routing wiele nazwanych tras do jednego działania

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 

Chcę wysłać wiele nazwanych tras do jednego działania na jednym kontrolerze, jestem upewniając url pozostały ze starej strony przekierować na właściwe strony.

Pozdrawiam.

Odpowiedz

2

Zawsze można napisać trasy wielofunkcyjny z wyrażenia regularnego, aby uchwycić szczegóły:

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 
    } 

To powinno uchwycić konkretnych stron i przekierować je odpowiednio . Bardziej niezawodnym rozwiązaniem jest posiadanie pewnego rodzaju tabeli odnośników w bazie danych, która jest sprawdzana przed udostępnieniem dowolnej zawartości lub stron typu 404.

Edit: Do wymienionych tras, jest to łatwy zmiana:

%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 

W większości przypadków stare trasy mogą być zapisane w liczbie pojedynczej trasy starszego wymieniony jako pierwszy. Najlepiej jest również utrzymywać stół routingu jako wykończenie, jak to tylko możliwe. Druga metoda jest bardziej kuli, aby spróbować połączyć stare trasy.

+0

Idealne ... i aby uczynić go jeszcze bardziej zwięzły nie potrzeba do utworzenia obiektu regex można po prostu zrobić ... old_content_names_regexp =/customs_packages_options | dom | utworu/ – Smickie

+1

Podczas schludny, to nie właściwie robią to, o co się prosi. Dostarcza jedną nazwaną trasę, która jest sparametryzowana za pomocą 'page_name'. Pytanie dotyczyło wielu nazwanych tras. –

+0

Nie zapewnia tej samej funkcji nazwanych tras, ale można ją łatwo dodać. – tadman

7

Użyj metody 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