Warum stimmen Routen mit einem Punkt in einem Parameter nicht überein?

77

Ich habe eine Route für meine Benutzer wie /iGEL/contributions, die gut funktioniert. Aber jetzt hat sich ein Benutzer mit einem Namen wie 'A.and.B.' registriert, und jetzt stimmt die Route nicht mehr überein, da der Name Punkte enthält.

Meine Route:

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

Irgendwelche Ideen?

iGEL
quelle

Antworten:

140

Siehe die blaue Infobox hier :

Standardmäßig akzeptieren dynamische Segmente keine Punkte. Dies liegt daran, dass der Punkt als Trennzeichen für formatierte Routen verwendet wird. Wenn Sie einen Punkt in einem dynamischen Segment verwenden müssen, fügen Sie eine Einschränkung hinzu, die diese überschreibt. Sie :id => /[^\/]+/lässt beispielsweise alles außer einem Schrägstrich zu.

Das wäre zum Beispiel:

get "/:user/contributions" => 'users#contributions', :constraints => { :user => /[^\/]+/ }
Zabba
quelle
4
Vielen Dank. Der von Ihnen zitierte reguläre Ausdruck hat einen Tippfehler, er sollte / [^ \ /] + / sein, nicht / [^ \ /] / +. Aber das ist ein Fehler in der Originalanleitung.
iGEL
Die Syntax wäre zum Beispiel: get "/: user / Contributions" => 'users # Contributions' ,: Constraints => {: id => / [^ \ /] + /}
DavidJ
/.*/funktioniert auch, ich kenne Regex nicht gut genug, um den Unterschied zu erkennen.
Kris
Hast du mehr Details @RyanGlen? es funktioniert auf dem angegebenen Rubin auf Schienen versio.
Zabba
1
In Rails 6 musste ich festlegen format: false, defaults: {format: 'html'} , dass Rails nicht mehr versucht, das Punktsegment als Dateierweiterung zu behandeln, die einen Inhaltstyp angibt.
David Moles
8

Wenn Ihr Variablensegment das letzte ist, wird bei Verwendung des [^\/]regulären Ausdrucks auch das Format verwendet. Verwenden Sie in einem solchen Fall lieber:

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