2010-02-17 19 views
5

C'è un modo più semplice di scrivere questo:Rails, routing molti percorsi denominati ad un'azione

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 

Voglio inviare molti percorsi denominati ad un'azione su un controller, sto facendo in modo di url rimasto da un vecchio sito reindirizzare alle pagine corrette.

Cheers.

risposta

2

Si può sempre scrivere un percorso polifunzionale con un'espressione regolare per catturare i dettagli:

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 
    } 

Questo dovrebbe catturare pagine specifiche e reindirizzare di conseguenza . Una soluzione più solida consiste nel disporre di una sorta di tabella di ricerca in un database controllato prima di pubblicare qualsiasi contenuto o pagine di tipo 404.

Edit: Per i percorsi di nome, si tratta di un'alterazione facile:

%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 

Nella maggior parte dei casi i vecchi percorsi possono essere riscritti utilizzando il percorso eredità singolare elencato per primo. È anche meglio mantenere il tavolo di routing il più ordinato possibile. Il secondo metodo è più di una stampella per cercare di colmare le vecchie rotte.

+0

Perfetto ... e per rendere ancora più succinta non è necessario per creare l'oggetto regex si può solo fare ... old_content_names_regexp =/customs_packages_options | home | pista/ – Smickie

+1

Mentre pulito, questo non lo fa effettivamente fare ciò che è richiesto. Fornisce una rotta denominata che è parametrizzata con un 'page_name'. La domanda si riferiva a molti percorsi denominati. –

+0

Non fornisce la stessa funzionalità named-routes, ma è facile da aggiungere. – tadman

7

utilizzare il metodo 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