2 votes

ROR route avec parenthèses dans la contrainte

J'essaie de créer un chemin de fer pour les films (sur le chemin racine) qui contient des parenthèses contenant l'année du film.

Par exemple, Men in black => "/men-in-black-(1997)".

Mon itinéraire est le suivant :

resources :movies,
  path:'/',
  only:[ :index, :list, :show ],
  constraints: { id: /[A-Za-z0-9-]+\(\d{4}\)/ }

Lorsque j'utilise cette route (movie_path(Movie.first)), j'obtiens

"ActionController::RoutingError: No route matches: ..."

Lorsque je change la contrainte d'itinéraire en :

constraints: { id: /[A-Za-z0-9-]+\\\(\d{4}\\\)/ }

la route fonctionne en utilisant l'aide de routage url. Cependant, la route ne fonctionne pas pour le mappage inverse (par exemple, en prenant "/men-in-black-(1997)" et en le routant vers l'action/contrôleur correct). Lorsque j'exécute (depuis la console) :

Rails.application.routes.recognize_path("/men-in-black-(1997)")

J'obtiens la même erreur de routage :

ActionController::RoutingError: No route matches

Le problème semble être lié à la façon dont rails échappe les expressions rationnelles dans le routage. Pour l'échappement avec \(, la carte objet-à-route échoue, mais url-à-route fonctionne. Mais lorsque l'échappement est effectué avec \\\ ( c'est le contraire.

Quelqu'un a-t-il des conseils ou une expérience dans ce domaine ?

2voto

Ian Points 1250

En guise de solution de contournement, vous pouvez essayer :

constraints: { id: /[A-Za-z0-9-]+(\\\(\d{4}\\\)|\(\d{4}\))/ }

C'est-à-dire, faire en sorte que la contrainte accepte l'un ou l'autre, si elle accepte l'un dans un cas et l'autre dans l'autre cas.

Ce qui revient à dire : c'est bizarre, je n'ai aucune idée de la raison pour laquelle Rails fait cela ou de la façon de le réparer ;)

0voto

Msencenb Points 2313

Je n'ai pas beaucoup d'expérience dans l'écriture de contraintes regex, mais vous pouvez toujours créer une route joker et l'assainir dans le contrôleur.

match 'movies/*movie' => 'movie#action'

Cela vous donnera accès à un paramètre :movie avec tous les caractères saisis.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X