2014-09-29 114 views
0

我有一个约束:约束路由

get "test/:test_val" => "home#test", constraints: { test_val: /\d{4}/ } 

我需要它仅接受4位数。但是,它似乎不工作,因为这个约束没有引发错误。这是怎么回事?

回答

1

你的路线是完全正确的,因为它的工作对我来说应该工作(当我改变我的路线位数我得到这些错误) - 我在我的应用程序定义

路线:

get 'users/:id', to: 'users#show', constraints: { id: /\d{4}/ } 

错误,我得到:

ActiveRecord::RecordNotFound in UsersController#show 
Couldn't find User with id=1234 

这意味着它工作时将无法识别途径,如果数字是大于或小于4:

Routing Error 
No route matches [GET] "https://stackoverflow.com/users/123456" 

那么,你确定你没有与/test/:test_val这条路上面定义的任何其它途径,其压倒这一个?

另请注意,@Amadan在他的答案中提到使用regexp锚。哪个不行。你可以在Rails routing from outside in guide section: 3.8 Segment Constraints找到这个文件。它清楚地表示:

:约束条件采用正则表达式,但无法使用 正则表达式锚。例如,下面的路线将 不起作用:

get '/:id', to: 'posts#show', constraints: {id: /^\d/} 

但是,请注意,您不需要使用锚,因为所有路由都在开始固定。

我希望有所帮助。

0

/\d{4}/将测试字符串中是否有四个连续的数字。因此,123456789匹配,因为1234满足测试。你可能想锚开始和正则表达式的结尾:

/^\d{4}$/ 
+0

它仍然抛出相同的错误,这是一个函数中的无效参数,所以这个约束不起作用,因为它允许参数到达无效的函数。当然,我想先捕捉它 – 2014-09-29 05:14:23