2015-11-04 56 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