2010-11-03 85 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