I’m trying to create a rails route for movies (on the root path) that has parentheses containing the movie’s year in it.
E.g. Men in black => “/men-in-black-(1997)”
My route is:
resources :movies,
path:'/',
only:[ :index, :list, :show ],
constraints: { id: /[A-Za-z0-9-]+\(\d{4}\)/ }
When I use this route (movie_path(Movie.first)), I get
"ActionController::RoutingError: No route matches: ..."
When I change the route constraint to:
constraints: { id: /[A-Za-z0-9-]+\\\(\d{4}\\\)/ }
the route works when using the url routing helper. However, the route doesn’t work for the reverse mapping (e.g. taking “/men-in-black-(1997)” and routing it to the correct action/controller). When I run (from console):
Rails.application.routes.recognize_path("/men-in-black-(1997)")
I get the same routing error:
ActionController::RoutingError: No route matches
The problem seems to be associated to how rails escapes regex’s in routing. For escaping with \( the object-to-route map fails, but url-to-route works. But when escaping with \\\( it is the opposite.
Anyone have any tips or experience with this?
As a workaround hack you could try:
That is, make the constraint accept either, if it accepts one in one case and the other in the other case.
Which is to say: that’s weird, I have no idea why Rails would do that or how to fix it 😉