指向用户指定网址的链接被解释为相对网址

时间:2012-01-20 23:06:36

标签: ruby-on-rails url user-input url-parsing

很抱歉,如果这个问题已在其他地方得到解答,但我花了一段时间看起来没有运气。

在我的网络应用中,我要求用户为自己的博客指定网址。但是,他们并不总是在这些网址的开头加上“http://”。在网站的其他地方,当我链接到这些网址时,浏览器会将它们解释为相对网址。例如如果用户写了bobsblog.wordpress.com,则链接转到http://www.mydomain.com/bobsblog.wordpress.com

一种解决方案是使用“http://”预填充url字段。

但更好的解决方案是解析网址并添加方案(如果用户没有)。 rails是否提供了一个很好的方法呢?我查看了函数URI :: parse,但它似乎没有提供这样做的好方法。

2 个答案:

答案 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://”。