如何转换' link_to'在Rails中绝对

时间:2017-09-06 15:05:42

标签: html ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我的程序中存在问题,我在数据库中添加了一个链接,例如" www.google.com"当我在链接中将我重定向到localhost:3000 / www.google.com时,当我放置" http://www.google.com"时,这不会发生。在DB。

我的代码

<td><%= link_to t.title, t.link_to_idea, :target => "_blank" %></td>

如何永久地转换此链接? (我想我是这个解决方案)

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

<td><%= link_to t.title, t.link_to_idea.start_with?('http') ? t.link_to_idea : "http://#{t.link_to_idea}", :target => "_blank" %></td>

..但是假设您希望所有链接都使用http而非https保存。 在将数据库中的链接保存之前,最好检查协议。

例如,您可以执行此答案建议的内容:Add http(s) to URL if it's not there?

before_validation :smart_add_url_protocol

protected

def smart_add_url_protocol
  unless self.url[/\Ahttp:\/\//] || self.url[/\Ahttps:\/\//]
    self.url = "http://#{self.url}"
  end
end

这样你就可以做你已经拥有的。

答案 1 :(得分:0)

我认为最好的办法是更新数据库中的链接,使其符合标准格式。您还可以添加更基本的验证,以确保所有链接都符合有效格式:

validates :link_to_idea, format: URI.regexp

您还可以在数据库上运行回填,检查旧链接以确保它们与此模式匹配,然后更新那些不起作用的回填。你在使用MySQL吗?

无论哪种方式,最好的答案不是试图让你的应用程序呈现用户放入的任何旧东西,而是在数据进入数据库之前清理数据。

如果您无法控制进入数据库的内容,那么我只需将任何与Regexp不匹配的内容呈现为文本,并让用户自己将其放入浏览器中。

答案 2 :(得分:0)

我建议您使用Draper创建装饰器。这将允许您将表示逻辑与域对象分离。

一旦你进行了设置,你就可以写下类似的内容:

# app/decorators/idea_decorator.rb
class IdeaDecorator < Draper::Decorator
  delegate_all   

  def idea_url(protocol = 'https')
    return link_to_idea if has_scheme?

    "#{protocol}://#{link_to_idea}"
  end

  private

  def has_scheme?
    # .. some method here to determine if the URL has a protocol
  end
end

在视图中使用:

<%= link_to t.title, t.decorate.idea_url('https') %>