2010-05-20 3 views
0

Je suis en train de mettre en place une fonctionnalité d'URL courte pour une application sur laquelle je travaille et qui fonctionne maintenant et transforme des URL plus longues en URL courte par base36 codant l'ID d'un enregistrement pointant vers l'URL plus longue , par exemple:Requête d'itinéraire personnalisée Rails

http://localhost:3000/7ps ->http://localhost:3000/the/long/url

Je me bats pour écrire un itinéraire qui intercepter les demandes de courte URL tout en permettant les demandes d'autres URL valides dans l'application.

Y a-t-il une route que je peux utiliser qui ne cible que les valeurs encodées en base36 après le domaine?

Merci pour toute aide!

Répondre

2

Vous pouvez ajouter:

map.encoded ":encoded_url", :controller => :encoded_urls, :action => :please_decode_me 

à la fin de vos itinéraires. Ensuite, il devrait attraper tout ce qui n'est pas attrapé par d'autres routes.

+0

Ceci va échouer (dans une erreur de type logique) pour la raison que j'ai indiquée dans ma réponse. – jdl

+0

@jdl: lors de la création d'une nouvelle URL codée, il peut vérifier les mots interdits. Ce n'est pas la meilleure solution, mais cela fonctionnera. – klew

+0

Bien sûr. Et puis vérifiez la liste des URL courtes à chaque fois qu'un nouveau contrôleur doit être ajouté. Cela peut fonctionner, mais c'est difficile à maintenir, et les échecs seront silencieux. – jdl

1

La réponse courte est "ça dépend". Vous pouvez ajouter un itinéraire à la fin de votre fichier de routes comme un fourre-tout. Cependant, si vous avez des routes réelles d'un mot, cela finira par échouer. Par exemple: Si vous avez un chemin qui ressemble à http://localhost:3000/home, quel est-il? Est-ce la page home ou l'URL courte de l'objet # 825062? Tout chemin d'un seul mot que vous avez dans votre application va avoir ce problème.

Un moyen très simple de contourner ce problème serait d'ajouter un seul caractère comme premier répertoire dans votre URI.

http://localhost:3000/r/abc123

Ou quelle que soit la lettre que vous voulez. Ensuite, vous pouvez facilement mapper tout ce qui commence par/r/à votre contrôleur de recherche d'URL courte.

map.connect "/r/:short_url", :controller => "controller_name", :action => "name_of_action_that_looks_up_short_urls" 
Questions connexes