2012-09-17 74 views
2

我有我的應用程序的路線,看起來是這樣的:軌道路由約束正則表達式有隱式錨嗎?

match '/:id' => 'controller#action', :constraints => { :id => VALID_IDS } 

其中VALID_IDS就像

/(good_id|another_good_id|a_valid_id)/ 

一個正則表達式白名單,現在看來該URI

/good_id_one 

是不符合此限制,即使

1.9.2p318 :004 > "good_id_one".match /^(good_id|another_good_id|a_valid_id)/ 
=> #<MatchData "good_id" 1:"good_id"> 

這是爲什麼?我有一個懷疑。 This guide

:約束條件需要正則表達式,限制正則表達式錨點不能使用。 但是,請注意,您不需要使用錨點,因爲所有路線都在開始時錨定。

是不是也是軌在年底的正則表達式的增加了一個錨的情況下?這將解釋我所看到的,因爲

1.9.2p318 :006 > "good_id_one".match /^(good_id|another_good_id|a_valid_id)$/ 
=> nil 

但是,我不確定這種懷疑是否正確。任何人都可以證實或否認我的假設?

(P.S.,Rails 3.0.11, Ruby 1.9.2

回答

-1

這是因爲隱式錨的不是,那是因爲你的表現結束了/的。

嘗試:

/(good_id|another_good_id|a_valid_id) 
+0

對不起,那文字語法只是用於演示目的。正則表達式匹配器實際上是由Regexp.new(「(good_id | another_good_id | a_valid_id)」)構造的。斜槓不是正則表達式的一部分。 – gregates

+0

在這種情況下,我認爲你需要在/開始。 Regexp.new(「/(good_id | another_good_id | a_valid_id)」)和this *由於錨點而變化。 –

+0

Rails與正則表達式匹配的是'params [:id]',它不包含前導'/'。如果添加,則路由不匹配以下任一路徑:'/ good_id','/ good_id_one'。 – gregates