Możesz dodać ograniczenie routingu do wielu tras jednocześnie za pomocą constraints() do ... end
.
Skończyło się na tym, że zrobiłem to i ustawiłem globalne ograniczenie na wszystkie :id
parametry, aby dopasować je do wyrażenia regularnego 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
W ten sposób /posts/123 lub /posts/foobar nie pasują już do /posts/:id i 404 przed wywołaniem akcji kontrolera, co pozwala uniknąć błędu typu PG.
Wszystkie moje modele będą używać identyfikatorów UUID, więc jest to czyste i suche. Gdybym miał kilka modeli z identyfikatorami całkowitymi, byłoby to trochę mniej czyste.