2010-11-03 15 views
19

Necesito convertir un sitio de carriles 2.3 para que todas las URL externas se abran en una nueva ventana. Podría ir a través de cada llamada al link_to y agregar :target => '_blank', pero me gustaría hacerlo en un solo paso para todos los enlaces, presentes y futuros. ¿Hay alguna manera de que yo pueda parchear link_to para obtener el comportamiento deseado?¿Cómo hago link_to para abrir URL externas en una nueva ventana?

+3

No haga esto. Respeta a tus usuarios y déjalos que decidan cómo les gustaría que se abran los enlaces. –

+35

Es una buena idea, pero creo que respetaré a mis jefes y haré lo que me digan. – Simon

+4

a veces es mejor decir no a nuestro jefe. Estoy de acuerdo con John no hagas esto – shingara

Respuesta

4

Al final me fui con esto, en un inicializador:

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

En Rails 4, '@ controller' no está definido y también carece de compatibilidad con https. Aquí los cambios https://gist.github.com/RoxasShadow/b5c59152183ff9ba0757/revisions. Gracias por el fragmento por cierto. –

3

Usted acaba de agregar un ayudante para añadir esta opción en su link_to

Si desea añadir que en cada link_to que se puede añadir en 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 

O puede crear su propio ayudante 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

¿No cambiará esto también los enlaces internos? Tal vez el Simon debería simplemente usar algunos javascript para apuntar a los enlaces externos? – monocle

+0

cambiar todo el enlace generar por link_to helper. No puedes hacer más. – shingara

17

No debe tener que cambiar el código del lado del servidor para este problema de vista.

Debería usar Unobscursive javascript. Este ejemplo sólo hará que los enlaces externos a aparecer en una nueva ventana:

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

funciona a la perfección! ¡Gracias! – kibaekr

+0

muy bueno! Gracias – Automatico

+0

Esto me causó problemas con los enlaces de jquery –

1

En los carriles 3.2 o versiones posteriores, se ha añadido como una opción, simplemente agregue

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

y se abrirá el enlace en una nueva pestaña.

+1

El problema no es cómo hacer que un enlace se abra en una nueva ventana; es cómo hacer que todos los enlaces externos se abran en una nueva ventana. – Simon

Cuestiones relacionadas