Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将Rails路由中的参数限制为INT(11)范围_Mysql_Ruby On Rails_Regex_Ruby On Rails 4 - Fatal编程技术网

Mysql 将Rails路由中的参数限制为INT(11)范围

Mysql 将Rails路由中的参数限制为INT(11)范围,mysql,ruby-on-rails,regex,ruby-on-rails-4,Mysql,Ruby On Rails,Regex,Ruby On Rails 4,问题:当API客户端向我的Rails 4.2.4应用程序发送参数超过最大值2147483647的请求时,我经常遇到此类异常: 范围错误:1446629302683超出的范围 ActiveRecord::Type::限制为4的整数 数据库是MySQL,列的数字类型是INT(11),因此我考虑直接在路由中限制可接受参数的范围,例如 get 'movies/:id(.:format)' => 'movies#show', constraints: { id: /.../ } 在这里,如何将4字

问题:当API客户端向我的Rails 4.2.4应用程序发送参数超过最大值2147483647的请求时,我经常遇到此类异常:

范围错误:1446629302683超出的范围 ActiveRecord::Type::限制为4的整数

数据库是MySQL,列的数字类型是INT(11),因此我考虑直接在路由中限制可接受参数的范围,例如

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

在这里,如何将4字节的范围定义为正则表达式?或者有更聪明的方法吗?

我建议您使用8字节整数(bigint)而不是4字节整数,而不是限制路由中的ID

在迁移文件中使用(
limit:8
选项)以这种方式声明它:

这将为您的
id
提供一个最高为
9223372036854775807
的限制,其中4字节整数的限制为
2147483647

请参阅这篇文章,了解更多有关的信息

但是,如果您真的想使用正则表达式将ID限制为bigint limit(
9223372036854775807
),那么以下是正则表达式:

\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
这个正则表达式是由生成的,我对它进行了测试

因此,使用上述正则表达式,您的路线将变为:

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
/ }

我建议您使用8字节整数(bigint)而不是4字节整数,而不是限制路由中的ID

在迁移文件中使用(
limit:8
选项)以这种方式声明它:

这将为您的
id
提供一个最高为
9223372036854775807
的限制,其中4字节整数的限制为
2147483647

请参阅这篇文章,了解更多有关的信息

但是,如果您真的想使用正则表达式将ID限制为bigint limit(
9223372036854775807
),那么以下是正则表达式:

\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
这个正则表达式是由生成的,我对它进行了测试

因此,使用上述正则表达式,您的路线将变为:

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
/ }

为什么要使用正则表达式?您确切地知道限制,所以只需检查参数是否低于限制。您将如何在route指令中表示这样的条件?为什么要使用正则表达式?您确切地知道限制,所以只需检查参数是否低于限制。您如何在route指令中表示这种情况?如果API客户端发送的请求(无效)ID大于9223372036854775807…@Boris查看我更新的答案,我在其中向您展示了如何使用regex执行此操作,则仍会引发异常。让我知道这是否有帮助,或者如果您有任何其他问题。谢谢,让我指向regex_for_范围生成器是解决方案。在我的案例中,我的案例中的路线变成了:<代码>获取“电影”电影/:id(:::::::::<代码>获取“电影”的电影;表演,约束::{id:/1[9 9 9 9][99 9 9 9][99 9][99 9 9 9][99 9][99][99 9 9][99][99][99][99 9][99 9 9 9 9 9][9 9 9 9 9 9 9 9 9][20[0 0 0 0 0 0 0 0-9[0 0-9 7 7 7 7 7 7 7[0-9]0 0 0 0 0 0 0 0-9]0[0 0 0-9]0 0 0 0 0-9[0 0-9]0 0 0 0 0 0 0 0 0-9[0 0-9 7 7 7 7 7 7 7 7[0 0 0 0 0 0-9 7 7 7 7 7 7 7[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0(二)21474836[0-3][0-9]124748364[0-7][2-9][1-9][0-9][1-9][0-9][2-9][1-9][1-9][0-9][3-9][0-9]{4}{1-9][0-9]{5}{1-9][0-9]{6}{1-9][0-9]{7}{1-9][0-9]{8}/}欢迎您。我可以帮助您解决问题。我认为上面的表达式有缺陷!生成的表达式似乎有效,但太长,无法在此发布。如果API客户端发送带有(无效)的请求,仍会引发异常id大于9223372036854775807…@Boris请查看我的更新答案,我在其中向您展示了如何使用regex进行此操作。请告诉我这是否有帮助,或者您是否有任何其他问题。谢谢,将我指向regex_for_范围生成器是解决方案。在我的情况下,路由变为:
get'movies/:id(:format)=>“movies#show”,约束:3.3[0-3][0-3[0-3][0-9 0-9[0-3][0-9[0-9[0-9[0-3][0-9[0-9{{7}{7}1[1-1 1[9-9][9-9][9-9][9-9][99 9][99 9 9 9 9][99 9 9 9 9 9][9 9 9 9 9 9 9 9 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7[2-9][0-9][1-9][0-9][1-9][0-9][3}[1-9][0-9][1-9][0-9][4}[1-9][0-9][0-9][5}[1-9][0-9][6}[1-9][0-9][7}1-9][0-9][0-9][8}
不客气。我可以帮你解决你的问题。我认为我在上面的表达式中使用的是错误的!生成了一个似乎有效但太长的表达式,无法在此处发布。