2014-09-29 152 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