Я начал использовать тип UUID Postgres для всех полей id моих моделей. Отлично работает и поддерживается (по большей части) в Rails 4:
create_table :users, id: :uuid do |t|
# ...
end
Проблема заключается в том, что Postgres будет вызывать ошибку, если вы попытаетесь найти строку, где id является X, но X не является правильно форматированной строкой UUID.
> User.find "3ac093e2-3a5e-4744-b49f-117b032adc6c"
ActiveRecord::RecordNotFound # good, will cause a 404
> User.find "foobar"
PG::InvalidTextRepresentation: ERROR # bad, will cause a 500
Итак, если мой пользователь находится на странице, где UUID находится в URL-адресе, и затем они пытаются изменить UUID, они получат ошибку 500 вместо 404. Или, возможно, они получают ссылку на объект, который нет дольше.
Как я могу избежать этого сценария сухим способом? Я не могу просто спасти PG::InvalidTextRepresentation
и отображать 404, потому что другие вещи могут также вызвать эту ошибку.
UPDATE
Я думаю, что регулярное выражение в формате идентификационного параметра является чистым, и оно вызывает 404, если оно не соответствует:
resources :users, id: /uuid-regex-here/
Но у меня все еще есть проблема оставаться сухим; Я не хочу ставить это на каждый ресурс на своих маршрутах. Я могу объявить несколько ресурсов в одном выражении, но только если для него нет других вариантов, подобных действиям членов. Итак, возможно, лучший вопрос: есть ли способ установить регулярное выражение id для всех маршрутов?