【问题标题】:How convert 'link_to' to Absolute in Rails如何在 Rails 中将 'link_to' 转换为 Absolute
【发布时间】:2017-09-06 15:05:42
【问题描述】:

我的程序有问题,我在数据库中添加了一个链接,例如“www.google.com”,当我点击链接时,我被重定向到 localhost:3000/www.google.com ,当我将“http://www.google.com”放入数据库时​​,不会发生这种情况。

我的代码

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

如何使此链接始终以绝对方式转换? (我想我这是解决方案)

谢谢!!

【问题讨论】:

  • 也许只需更新您的数据库并在需要的地方添加“http://”?
  • 我建议按照@SergioTulentsev 的建议去做。 stackoverflow.com/questions/7908598/…
  • 但是我不允许修改数据库,只有当我修改我的代码时,总是在保存链接的时候输入 http 或 https。但它只适用于一种选择
  • 如果您的代码对数据库具有写入权限,您可以随时编写一个脚本来为您更新它。如果你走这条路,请确保你验证未来的链接格式正确。

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


【解决方案1】:

你可以这样做:

<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

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

【讨论】:

  • 我认为到目前为止你的解决方案是最好的,但是怎么说呢,我必须选择一个选项,http 或 https。我想指导一下 DB 列中的内容
  • 我的朋友,你的建议奏效了。现在,当我将鼠标放在链接上时,显示链接“www.google.com”,不再显示“localhost:3000/www.google.com”,非常感谢!!!
【解决方案2】:

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

validates :link_to_idea, format: URI.regexp

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

无论哪种方式,最好的答案不是尝试让您的应用呈现用户输入的任何旧内容,而是在数据进入数据库之前对其进行清理。

如果您无法控制进入数据库的内容,那么我会简单地将与该正则表达式不匹配的任何内容呈现为文本,并让用户自行将其放入浏览器中。

【讨论】:

  • 所以,我使用 Postgres,但我没有权限修改 DB
  • 我认为这很好,只需添加验证(这样您就不会得到更多脏数据,并检查您输出到页面的网址(通过正则表达式)以及它们是否不匹配,然后不要将它们设为链接。
【解决方案3】:

我建议您使用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') %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多