0

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

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

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

但更好的解决方案是解析 url 并在用户没有的情况下添加方案。Rails 是否提供了一个很好的方法来做到这一点?我查看了函数 URI::parse,但它似乎并没有提供这样做的好方法。

4

2 回答 2

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" 
于 2012-01-21T19:25:52.510 回答
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

并且 URL 将保存在前面的“http://”。

于 2012-01-20T23:18:47.870 回答