RAILS中如何使用link_to创建外部网站链接,其中url是用户表的一个属性,例如:@users.website。

34
我正在开发一个允许用户创建账户的网站。其中创建用户时的一个属性是用户的个人网站。当我尝试像这样使用用户的网站:
<%= link_to @user.site, @user.url %>

生成的URL是:http://0.0.0.0:3000/www.userswebsite.com

我认为这是由于link_to中的@user部分引起的...但我如何将其链接到www.userwebsite.com?

4个回答

97
您可以在url前加上协议,如果它不存在:

您可以在url前加上协议,如果它不存在:

module UrlHelper
  def url_with_protocol(url)
    /^http/i.match(url) ? url : "http://#{url}"
  end
end

然后:

link_to @user.site, url_with_protocol(@user.url), :target => '_blank'

2
请使用 :target => '_blank' 而不是 :target => :blank。后者无法按预期工作,您可以尝试在新创建的窗口中打开相同的链接进行验证。 - dostu
如果我的URL中不包含“www。”,那么我的应用程序会将其视为内部链接。例如,“http://example.com”链接到当前页面。 - Dennis

28

看起来你需要在链接上粘贴协议。例如,如果你的数据库中有www.userswebsite.com,它应该是http://www.userswebsite.com


1
这个能够运作,但它依赖于在数据库中始终保持一个经过清理的 URL,这可能并不总是可能的...请参见 Voldy 的答案,它会在输出时对其进行清理。 - rogerdpack

3
你正在存储没有http://的URL,因此它们被解释为相对URL。试试这个: link_to @user.site, "http://#{@user.url}"

1

尝试使用神奇的宝石 Domainatrix

然后,您可以通过以下方式轻松解析URL:

<%= Domainatrix.parse(@user.url).url %>

更好的方法是在用户模型中创建一个before_save动作,在保存之前解析URL。
before_save :parse_url

def parse_url
  if self.url
    self.url = Domainatrix.parse(self.url).url
  end
end

以下是您可以使用Domainatrix完成的一些示例:

url = Domainatrix.parse("http://www.pauldix.net")
url.url       # => "http://www.pauldix.net" (the original url)
url.public_suffix       # => "net"
url.domain    # => "pauldix"
url.canonical # => "net.pauldix"

url = Domainatrix.parse("http://foo.bar.pauldix.co.uk/asdf.html?q=arg")
url.public_suffix       # => "co.uk"
url.domain    # => "pauldix"
url.subdomain # => "foo.bar"
url.path      # => "/asdf.html?q=arg"
url.canonical # => "uk.co.pauldix.bar.foo/asdf.html?q=arg"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接