Vous pouvez ajouter une contrainte de routage à plusieurs routes à la fois via constraints() do ... end
.
J'ai fini par faire cela et définir une contrainte globale sur tous les :id
params pour le faire correspondre à une expression régulière UUID :
MyApp::Application.routes.draw do
constraints(id: /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i) do
# my routes here
end
end
De cette façon, /posts/123 ou /posts/foobar ne correspondent plus à /posts/:id et 404 avant même d'invoquer l'action du contrôleur, évitant ainsi l'erreur de type PG.
Tous mes modèles utiliseront UUID pour leurs identifiants, donc c'est propre et sec. Si j'avais aussi des modèles avec des ID entiers, ce serait un peu moins propre.