Über constraints() do ... end
können Sie mehreren Routen gleichzeitig eine Routing-Einschränkung hinzufügen .
Am Ende habe ich dies getan und eine globale Einschränkung für alle :id
festgelegt params, um es mit einem UUID-Regexp abzugleichen:
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
Auf diese Weise stimmen /posts/123 oder /posts/foobar nicht mehr mit /posts/:id und 404 überein, bevor jemals die Controller-Aktion aufgerufen wird, wodurch der PG-Typfehler vermieden wird.
Alle meine Modelle verwenden UUID für ihre IDs, also ist dies sauber und TROCKEN. Wenn ich auch einige Modelle mit ganzzahligen IDs hätte, wäre es etwas weniger sauber.