2010-11-03 12 views
19

Tüm harici URL'lerin yeni bir pencerede açılabilmesi için bir rails 2.3 sitesini dönüştürmem gerekiyor. Her çağrıya link_to numaralı telefondan gidebilir ve :target => '_blank''u ekleyebilirim, ancak şimdiki ve gelecekteki tüm bağlantılar için bunu tek adımda yapmak isterim. İstenilen davranışı elde etmek için link_to yama kurabileceğim bir yol var mı?Yeni bir pencerede harici URL'leri açmak için nasıl link_ yapabilirim?

Eğer ApplicationHelper

üzerinde
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 

ekleyebilir için her link_to üzerine eklemek istiyorum Ya da kendi link_to yardımcı oluşturabiliyorsanız Sadece kendi link_to

bu seçeneği eklemek için bir yardımcı eklemek

+3

Lütfen bunu yapma. Kullanıcılarınıza saygı gösterin ve bağlantıların nasıl açılmasını istediğinize karar vermek için onlara bırakın. –

+35

Güzel bir fikir, ama bence patronlarıma saygı duyuyorum ve onun yerine söylüyorum. – Simon

+4

bazen patronumuza hayır dememiz daha iyidir. John ile aynı fikirdeyim: – shingara

cevap

4

, Başlatıcı bir de: Rayların 3.2+ yılında

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' tanımlanmamış ve aynı zamanda bu https desteğinden yoksundur. Burada değişiklikler https://gist.github.com/RoxasShadow/b5c59152183ff9ba0757/revisions. Snippet btw için teşekkürler. –

3

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

Bu iç bağlantıları değiştirmez mi? Belki de Simon dış bağlantıları hedeflemek için biraz javascript kullanmalıdır? – monocle

+0

link_to helper tarafından oluşturulan tüm linkleri değiştir. Daha fazlasını yapamazsın. – shingara

17

Bu görünüm sorunu için sunucu tarafı kodunuzu değiştirmeniz gerekmemelidir.

Unobscursive javascript kullanmalısınız. Bu örnek sadece dış bağlantılar yeni bir pencerede gösterilmesini yapmayı daha: Bununla gitti Sonunda

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

kusursuz çalışıyor! Teşekkürler! – kibaekr

+0

çok güzel! Teşekkürler – Automatico

+0

Bu jquery bağlantıları ile bana sorunlara neden oldu –

1

, bu eklendi Bir seçenek olarak,

ekleyin ve bağlantıyı yeni bir sekmede açar.

+1

Sorun, yeni bir pencerede bir bağlantının nasıl açılacağı değil; Tüm dış bağlantıların yeni bir pencerede nasıl açılacağıdır. – Simon

İlgili konular