我開始爲我所有模型的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'可以工作。 –