2010-11-03 14 views
19

Ho bisogno di convertire un sito di binari 2.3 in modo che tutti gli URL esterni si aprano in una nuova finestra. Potrei andare anche se ogni chiamata a link_to e aggiungere :target => '_blank', ma mi piacerebbe farlo in un solo passaggio per tutti i collegamenti, presenti e futuri. C'è un modo in cui posso riprodurre patch_to per ottenere il comportamento desiderato?Come faccio a creare un link per aprire URL esterni in una nuova finestra?

+3

Per favore non farlo. Rispetta i tuoi utenti e lascia loro la possibilità di decidere come desiderano aprire i link. –

+35

È una buona idea, ma penso che rispetterò i miei capi e farò come invece mi viene detto. – Simon

+4

a volte è meglio dire di no al nostro capo. Sono d'accordo con John non farlo – shingara

risposta

4

Alla fine sono andato con questo, in un initialiser:

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

In Rails 4, '@ controller 'non è definito e anche questa mancanza di supporto https. Qui le modifiche https://gist.github.com/RoxasShadow/b5c59152183ff9ba0757/revisions. Grazie per lo snippet btw. –

3

Basta aggiungere un aiutante per aggiungere questa opzione nel vostro link_to

Se vuoi aggiungere su ogni link_to per può aggiungere su 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 

Oppure è possibile creare il proprio aiutante 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

Non cambierà anche i collegamenti interni? Forse il Simon dovrebbe semplicemente usare qualche javascript per indirizzare i link esterni? – monocle

+0

cambia tutto il link generato da link_to helper. Non puoi fare di più. – shingara

17

Non si dovrebbe modificare il codice lato server per questo problema di visualizzazione.

Si consiglia di utilizzare lo scanner inavvertito. Questo esempio servirà solo a rendere i collegamenti esterni che mostra in una nuova finestra:

// 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

funziona perfettamente! Grazie! – kibaekr

+0

molto bello! Grazie – Automatico

+0

Questo ha causato problemi con i collegamenti jquery –

1

In rotaie versione successiva alla 3.2, è stato aggiunto come opzione, è sufficiente aggiungere

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

e si aprirà il collegamento in una nuova scheda.

+1

Il problema non è come rendere aperto un collegamento in una nuova finestra; è come rendere tutti i link esterni aperti in una nuova finestra. – Simon

Problemi correlati