Puede agregar una restricción de enrutamiento a varias rutas a la vez a través de constraints() do ... end
.
Terminé haciendo esto y estableciendo una restricción global en todos los :id
params para que coincida con una expresión regular de 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 esta forma, /posts/123 o /posts/foobar ya no coinciden con /posts/:id y 404 antes de invocar la acción del controlador, evitando así el error de tipo PG.
Todos mis modelos usarán UUID para sus ID, por lo que está limpio y SECO. Si tuviera algunos modelos con ID enteros también, sería un poco menos limpio.