如何在新窗口中使link_to打开外部URL?

时间:2010-11-03 12:23:58

标签: ruby-on-rails

我需要转换rails 2.3网站,以便在新窗口中打开所有外部URL。我可以通过每次拨打link_to并添加:target => '_blank',但我想一步到位,无论是现在还是将来。有没有办法我可以修补link_to以获得所需的行为?

4 个答案:

答案 0 :(得分:17)

您不必为此视图问题更改服务器端代码。

你应该使用Unobscursive javascript。 此示例仅使外部链接显示在新窗口中:

// jQuery
//
$(document).ready(function() {
  $("a").click(function() {
    link_host = this.href.split("/")[2];
    document_host = document.location.href.split("/")[2];

    if (link_host != document_host) {
      window.open(this.href);
      return false;
    }
  });
});

答案 1 :(得分:4)

最后,我在初始化中使用了这个:

module ExternalLinksInNewTabs
  def new_tab_link_to *args, &block
    if block_given?
      options = args.first || {}
      html_options = args[1] || {}

      if options.is_a? String
        if ExternalLinksInNewTabs.is_external_link? @controller.request.host, options
          html_options[:target] = '_BLANK'
        end
      end

      same_tab_link_to options, html_options, &block
    else
      name = args.first
      options = args[1] || {}
      html_options = args[2] || {}

      if options.is_a? String
        if ExternalLinksInNewTabs.is_external_link? @controller.request.host, options
          html_options[:target] = '_BLANK'
        end
      end

      same_tab_link_to name, options, html_options
    end
  end

  def self.is_external_link? host, url
    host.sub! /^www\./, ''
    url =~ /^http/i && url !~ /^http:\/\/(www\.)?#{host}/i
  end
end

module ActionView
  module Helpers
    module UrlHelper
      include ExternalLinksInNewTabs

      alias_method :same_tab_link_to, :link_to
      alias_method :link_to, :new_tab_link_to
    end
  end
end

答案 2 :(得分:3)

您只需添加一个帮助程序即可在link_to

中添加此选项

如果你想在每个link_to上添加它,可以在ApplicationHelper上添加

def link_to(*args, &block)
  if block_given?
    args = [(args.first || {}), (args.second || {}).merge(:target => '_blank')]
  else
    args = [(args.first || {}), (args.second || {}), (args.third || {}).merge(:target => '_blank')]
  end
  super(args, block)
end

或者您可以创建自己的link_to帮助

def link_to_blank(*args, &block)
  if block_given?
    args = [(args.first || {}), (args.second || {}).merge(:target => '_blank')]
  else
    args = [(args.first || {}), (args.second || {}), (args.third || {}).merge(:target => '_blank')]
  end
  link_to(args, block)
end

答案 3 :(得分:1)

在rails 3.2+中,它已作为选项添加,只需添加

= link_to 'facebook', 'http://www.facebook.com/fb-page', target: '_blank'

然后在新标签页中打开链接。