2010-02-17 6 views
5

Gibt es einen einfacheren Weg, dies zu schreiben:Rails, Routing viele benannte Routen zu einer Aktion

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 

ich viele Namen Routen zu einer Aktion auf einem Controller gesendet werden soll, mache ich das sicher url übrig von einer alten Site Redirect auf die richtigen Seiten.

Prost.

Antwort

2

Sie können immer ein Mehrzweck-Route mit einem regulären Ausdruck schreiben, um die Details zu erfassen:

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 
    } 

, die bestimmte Seiten erfassen sollte und leiten sie entsprechend . Eine robustere Lösung besteht darin, eine Art Nachschlagetabelle in einer Datenbank einzurichten, die überprüft wird, bevor Inhalte oder Seiten vom Typ 404 bereitgestellt werden.

bearbeiten: Für benannte Routen, es ist eine einfache Änderung:

%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 

In den meisten Fällen die alten Routen zuerst die einzigartige Vermächtnis Route mit aufgelistet neu geschrieben werden können. Es ist auch am besten, die Routing-Tabelle so gut wie möglich zu halten. Die zweite Methode ist eher eine Krücke, um die alten Routen zu überbrücken.

+0

Perfekt ... und machen es noch prägnanter Sie einfach tun können, nicht das Regex-Objekt erstellen müssen ... old_content_names_regexp =/customs_packages_options | home | Spur/ – Smickie

+1

Während ordentlich, dies nicht eigentlich tun, was gefragt wird. Es bietet eine benannte Route, die mit einem 'Seitenname' parametrisiert ist. Die Frage bezog sich auf viele benannte Routen. –

+0

Es bietet nicht die gleiche Funktionalität für benannte Routen, aber das ist einfach hinzuzufügen. – tadman

7

Verwenden Sie die with_options Methode:

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