web-dev-qa-db-fra.com

Pourquoi les routes avec un point dans un paramètre ne correspondent-elles pas?

J'ai un itinéraire pour mes utilisateurs comme /iGEL/contributions, qui fonctionne bien. Mais maintenant, un utilisateur enregistré avec un nom comme 'A.and.B.', et maintenant l'itinéraire ne correspond pas, car le nom contient des points.

Mon parcours:

get "/:user/contributions" => 'users#contributions'

Des idées?

77
iGEL

Voir la boîte d'informations bleue ici :

Par défaut, les segments dynamiques n'acceptent pas les points. En effet, le point est utilisé comme séparateur pour les itinéraires formatés. Si vous devez utiliser un point dans un segment dynamique, ajoutez une contrainte qui l'emporte - par exemple :id => /[^\/]+/ autorise tout sauf une barre oblique.

Ce serait par exemple:

get "/:user/contributions" => 'users#contributions', :constraints => { :user => /[^\/]+/ }
135
Zabba

Si votre segment variable est le dernier, utilisez alors le [^\/] regex mangera également le format. Dans un tel cas, utilisez plutôt:

/([^\/]+?)(?=\.json|\.html|$|\/)/
8
Christopher Oezbek
7
huntsfromshadow