2010-02-17 6 views
5

est-il un moyen plus simple d'écrire ceci:Rails, routage de nombreuses routes nommées à une seule action

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 

Je veux envoyer beaucoup de routes nommées à une action sur un contrôleur, je fais URL que gauche sur d'un ancien site rediriger vers les pages correctes.

Cheers.

Répondre

2

Vous pouvez toujours écrire un itinéraire multi-usages avec une expression régulière pour capturer les détails:

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 
    } 

Cela devrait capturer des pages spécifiques et de les rediriger en conséquence . Une solution plus robuste consiste à avoir une sorte de table de recherche dans une base de données qui est vérifiée avant de servir un contenu ou des pages de type 404.

Modifier: Pour les routes nommées, il est une modification 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 

Dans la plupart des cas, les anciennes routes peuvent être réécrites en utilisant la voie de l'héritage singulier apparaît en premier. Il est également préférable de garder la table de routage aussi découpée que possible. La deuxième méthode est plus d'une béquille pour essayer de combler les anciennes routes.

+0

parfait ... et pour le rendre encore plus succinct que vous n'avez pas besoin de créer l'objet regex vous pouvez juste faire ... old_content_names_regexp =/customs_packages_options | accueil | piste/ – Smickie

+1

Alors propre, cela ne fait réellement ce qui est demandé. Il fournit une route nommée qui est paramétrée avec un 'page_name'. La question portait sur de nombreuses routes nommées. –

+0

Il ne fournit pas la même fonctionnalité named-routes, mais c'est facile à ajouter. – tadman

7

Utilisez la méthode 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 
Questions connexes