我有一个link
属性的模型。 link属性可以设置为外部URL,例如:http://google.com
或引用内部页面,例如:/users/1
。
表单link
只是一个没有验证的文本字段。它使用link_to "whatever", model.link
呈现。
有很多关于rails的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 :(得分:0)
因为只有管理员才会使用此文件,所以我只需要进行最低限度的验证,以确保输入正确的前缀(这样就不会意外遗漏某个字符)我最终会这样做:
validates :link, :format => /(^$)|(^(http:\/\/|https:\/\/|\/))/ix
如果有人有更好的解决方案,我愿意改变它。