我开始为我所有模型的id字段使用Postgres UUID类型。在轨道4的伟大工程,支持(大部分):在Rails中使用Postgres UUID时避免PG :: InvalidTextRepresentation错误
create_table :users, id: :uuid do |t|
# ...
end
的问题是,如果你试图找到一排,其中ID为X Postgres将产生一个错误,但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,他们会得到的,而不是404 500错误或者也许他们得到一个链接一个不再存在的对象。
我怎样才能避免这种情况下干的方式?我不能挽救并渲染404,因为other things也会导致此错误。
UPDATE
我认为,在ID参数的时格式的正则表达式是干净的,而且它提出了一个404,如果不匹配:
resources :users, id: /uuid-regex-here/
但我仍然有停留干的问题;我不想把这个放在我的路线中的每一个资源上。我可以在一个语句中声明多个资源,但前提是不要将其他选项用作成员操作。 所以也许更好的问题是:有没有一种方法来设置所有路线的ID正则表达式?
你为什么要通过foobar?你的路线在它落在你的模型之前是否应该抓住它? –
@Denis我想我可以对id参数进行约束,以确保它匹配UUID正则表达式。但是我必须为我的路线中的每一个资源都做到这一点......或者您还有其他想法吗? – tybro0103
也许你的控制器的'before_filter'可以工作。 –