2010-11-03 88 views
19

我需要转换一个rails 2.3站点,以便所有外部URL在新窗口中打开。我可以尽管打电话给link_to并添加:target => '_blank',但我希望一步完成所有链接,现在和将来。有没有办法让猴子补丁link_to得到想要的行为?如何使link_to在新窗口中打开外部URL?

+3

请不要这样做。尊重你的用户,并让他们决定他们希望链接如何打开。 – 2010-11-03 15:38:46

+35

这是一个不错的主意,但我认为我会尊重我的老板,并按我的意思去做。 – Simon 2010-11-03 18:21:34

+4

有时候最好对我们的老板说不。我同意约翰不要这样做 – shingara 2010-11-04 15:17:08

回答

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 
+1

在Rails 4中,“@ controller”没有定义,也缺少对https的支持。这里的变化https://gist.github.com/RoxasShadow/b5c59152183ff9ba0757/revisions。谢谢你的摘录顺便说一句。 – 2015-04-02 08:24:57

3

如果你想添加它每个的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帮助你只需要添加一个帮手,在您的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 
+0

这不会也改变内部链接吗?也许西蒙应该使用一些JavaScript来定位外部链接? – monocle 2010-11-03 13:10:44

+0

更改由link_to helper生成的所有链接。你不能做更多。 – shingara 2010-11-03 13:37:33

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; 
    } 
    }); 
}); 
+0

完美的作品!谢谢! – kibaekr 2012-12-06 11:52:13

+0

非常好!谢谢 – Automatico 2013-01-20 11:52:36

+0

这对jquery链接造成了问题 – 2013-03-03 12:28:54

1

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

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

并且它会在新选项卡中打开链接。

+1

问题不在于如何在新窗口中打开一个链接;这是如何使所有外部链接在新窗口中打开。 – Simon 2013-12-10 13:57:55