Можете да добавите ограничение за маршрутизиране към множество маршрути наведнъж чрез constraints() do ... end
.
В крайна сметка направих това и зададох глобално ограничение за всички :id
параметри, за да го съпоставите с UUID regexp:
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
По този начин /posts/123 или /posts/foobar вече не съвпадат с /posts/:id и 404, преди изобщо да извикат действието на контролера, като по този начин се избягва грешката тип PG.
Всички мои модели ще използват UUID за техните идентификатори, така че това е чисто и СУХО. Ако имах някои модели и с целочислени идентификатори, щеше да е малко по-малко чисто.