2015-11-04 57 views
1

問題:我不斷收到這種異常時API客戶端發送請求與最大的2147483647超過我的Rails 4.2.4應用參數:限制參數的Rails INT路線(11)的範圍

RangeError: 1446629302683 is out of range for ActiveRecord::Type::Integer with limit 4

數據庫是MySQL,列的數字類型是INT(11),所以我想直接在路由中限制可接受參數的範圍,例如

get 'movies/:id(.:format)' => 'movies#show', constraints: { id: /.../ } 

如何在這裏將4個字節的範圍定義爲正則表達式?還是有更聰明的方法呢?

+0

你爲什麼要使用正則表達式?你完全知道限制,所以只需檢查參數是否低於限制。 – Shadow

+0

您會如何在路線指令中表達這樣的條件? – Boris

回答

0

我會建議你使用8個字節整數BIGINT),而不是4個字節的整數,而不是限制在路徑的ID。

聲明這種方式與(limit: 8選項)遷移文件:

add_column :movies, :id, :integer, limit: 8 

這將給你id極限高達9223372036854775807其中與4個字節整數限制爲2147483647

看到這個職位瞭解bigint in Rails migrations, and what :limit means for column migrations的更多信息。

但是,如果你真的想用正則表達式來限制高達BIGINT限制(9223372036854775807)的ID,那麼這裏就是爲正則表達式:

\b([1-9][0-9]{0,17}|[1-8][0-9]{18}|9([01][0-9]{17}|2([01][0-9]{16}|2([0-2][0-9]{15}|3([0-2][0-9]{14}|3([0-6][0-9]{13}|7([01][0-9]{12}|20([0-2][0-9]{10}|3([0-5][0-9]{9}|6([0-7][0-9]{8}|8([0-4][0-9]{7}|5([0-3][0-9]{6}|4([0-6][0-9]{5}|7([0-6][0-9]{4}|7([0-4][0-9]{3}|5([0-7][0-9]{2}|80[0-7]))))))))))))))))\b 

這正則表達式是由Utility Mill生成和我測試了它在rubular

因此,使用上述正則表達式,你的路由變爲:

get 'movies/:id(.:format)' => 'movies#show', constraints: { id: /\b([1-9][0-9]{0,17}|[1-8][0-9]{18}|9([01][0-9]{17}|2([01][0-9]{16}|2([0-2][0-9]{15}|3([0-2][0-9]{14}|3([0-6][0-9]{13}|7([01][0-9]{12}|20([0-2][0-9]{10}|3([0-5][0-9]{9}|6([0-7][0-9]{8}|8([0-4][0-9]{7}|5([0-3][0-9]{6}|4([0-6][0-9]{5}|7([0-6][0-9]{4}|7([0-4][0-9]{3}|5([0-7][0-9]{2}|80[0-7]))))))))))))))))\b 
/} 
+0

如果API客戶端發送帶有(無效)ID大於9223372036854775807的請求,異常仍然會被拋出... – Boris

+0

@Boris看看我更新的答案,我向你展示瞭如何使用正則表達式來實現。讓我知道這是否有幫助,或者如果您有任何其他問題。 –

+1

謝謝,指着我_regex_for_range_發生器是解決方案。在我的情況下,路線變爲: 'get'movies /:id(。:format)'=>'movies#show',constraints:{id:/ 1 [-9] [ - 9] [ - 9] [ - 9] [ - 9] [ - 9] [ - 9] [ - 9] [ - 9] | 20 [0-9] {8} | 21 [0-3] [0-9] {7} | 214 [ 0-6] [0-9] {6} | 2147 [0-3] [0-9] {5} | 21474 [0-7] [0-9] {4} | 214748 [0-2] [ 0-9] {3} | 2147483 [0-5] [0-9] {2} | 21474836 [0-3] [0-9] | 214748364 [0-7] | [2-9] | [1 -9] [0-9] | [1-9] [0-9] {2} | [1-9] [0-9] {3} | [1-9] [0-9] {4} | [1-9] [0-9] {5} | [1-9] [0-9] {6} | [1-9] [0-9] {7} | [1-9] [0 -9] {8} /}' – Boris