2013-10-20 168 views
0

我有一個具有link屬性的模型。鏈接屬性可設置爲外部網址例如:http://google.com或引用內部頁面,例如:/users/1鏈接字段的自定義驗證

表格link只是一個沒有驗證的文本字段。它用link_to "whatever", model.link呈現。

有很多軌道URI驗證的例子。但是,我沒有發現也沒有考慮相關路徑。我正在考慮使用正則表達式,但想知道是否有更好的方法來設置一個link屬性,它可以處理外部(http/https)和內部(/ users/1,/ locations,/ whatever/1/something/2)路徑。

什麼應該被允許的東西不應該被允許

http://www.google.com 
https://www.google.com 
http://www.google.com?something=blah 
http://www.google.com/thing/test/ 
/locations 
/locations/1 
/products/1/skus/4 
"" (e.g. blank) 

例子

例子

www.google.com 
google.com 
products/2 
htt:// 

編輯

如果有更好的,完全不同解決這個問題我對此也持開放態度。

+0

根據您對參考網址的要求,正則表達式將不夠用。 (如果用戶放置/谷歌會發生什麼?)會建議爲所有網址制定一套統一的規則。 – rb512

+0

它不一定非常嚴格。這個工具只能由管理員訪問,所以我只是想要達到最低限度的驗證。如果他們輸入了'/ google',那麼它會想要一個不存在的頁面並將其重定向到404。我想要完成的是確保管理員遵循正確的格式,並且不會意外地錯過斜線或者其他的東西。 –

回答

0

因爲只有管理員會使用這個申請我只需要最低驗證,以確保輸入了正確的前綴(這樣一個角色是不小心錯過了),我結束了這是怎麼回事:

validates :link, :format => /(^$)|(^(http:\/\/|https:\/\/|\/))/ix 

如果有人有更好的解決方案,我願意改變它。