很抱歉,如果这个问题已在其他地方得到解答,但我花了一段时间看起来没有运气。
在我的网络应用中,我要求用户为自己的博客指定网址。但是,他们并不总是在这些网址的开头加上“http://”。在网站的其他地方,当我链接到这些网址时,浏览器会将它们解释为相对网址。例如如果用户写了bobsblog.wordpress.com,则链接转到http://www.mydomain.com/bobsblog.wordpress.com。
一种解决方案是使用“http://”预填充url字段。
但更好的解决方案是解析网址并添加方案(如果用户没有)。 rails是否提供了一个很好的方法呢?我查看了函数URI :: parse,但它似乎没有提供这样做的好方法。
答案 0 :(得分:1)
您可以使用URI.parse并检查方案。
before_save :sanitize_url
def sanitize_url
uri = URI.parse(url)
self.url = "http://#{url}" if uri.scheme.blank?
rescue URI::InvalidURIError => e
# not a parseable URI, so you need to handle that
end
这里有一些输出
ree-1.8.7-2011.03 :035 > x = URI.parse "http://google.com"
=> #<URI::HTTP:0x1069720c8 URL:http://google.com>
ree-1.8.7-2011.03 :036 > x.scheme
=> "http"
ree-1.8.7-2011.03 :037 > y = URI.parse "google.com"
=> #<URI::Generic:0x1069672e0 URL:google.com>
ree-1.8.7-2011.03 :038 > y.scheme
=> nil
ree-1.8.7-2011.03 :039 > z = URI.parse "https://google.com"
=> #<URI::HTTPS:0x10695b8f0 URL:https://google.com>
ree-1.8.7-2011.03 :040 > z.scheme
=> "https"
答案 1 :(得分:0)
也许在您的模型中,您可以使用一种方法将URL作为绝对URL返回。如果它不以“http://”开头,只需将其添加到前面。
def abs_url
(url.start_with? "http://") ? url : ("http://" + url)
end
在您看来,只需执行@user.abs_url
。
编辑:哦,我没有意识到,但你可能想在提交时这样做。在保存之前可以完成类似的逻辑。在那种情况下:
before_save :abs_url
...
def abs_url
url = (url.start_with? "http://") ? url : ("http://" + url)
end
网址将保存在前面的“http://”。