Você pode adicionar uma restrição de roteamento a várias rotas ao mesmo tempo via
constraints() do ... end
. Acabei fazendo isso e definindo uma restrição global em todos os
:id
params para combiná-lo com um regexp 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
Dessa forma, /posts/123 ou /posts/foobar não corresponde mais a /posts/:id e 404 antes de invocar a ação do controlador, evitando assim o erro de tipo PG.
Todos os meus modelos usarão UUID para seus IDs, então isso é limpo e DRY. Se eu também tivesse alguns modelos com IDs inteiros, seria um pouco menos limpo.