我有一個約束:約束路由
get "test/:test_val" => "home#test", constraints: { test_val: /\d{4}/ }
我需要它僅接受4位數。但是,它似乎不工作,因爲這個約束沒有引發錯誤。這是怎麼回事?
我有一個約束:約束路由
get "test/:test_val" => "home#test", constraints: { test_val: /\d{4}/ }
我需要它僅接受4位數。但是,它似乎不工作,因爲這個約束沒有引發錯誤。這是怎麼回事?
你的路線是完全正確的,因爲它的工作對我來說應該工作(當我改變我的路線位數我得到這些錯誤) - 我在我的應用程序定義
路線:
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/}
但是,請注意,您不需要使用錨,因爲所有路由都在開始固定。
我希望有所幫助。
/\d{4}/
將測試字符串中是否有四個連續的數字。因此,123456789
匹配,因爲1234
滿足測試。你可能想錨開始和正則表達式的結尾:
/^\d{4}$/
它仍然拋出相同的錯誤,這是一個函數中的無效參數,所以這個約束不起作用,因爲它允許參數到達無效的函數。當然,我想先捕捉它 – 2014-09-29 05:14:23