2013-10-20 123 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 

如果有人有更好的解决方案,我愿意改变它。