2010-11-03 26 views
19

Tôi cần chuyển đổi trang web 2.3 của đường ray để tất cả các URL bên ngoài mở trong một cửa sổ mới. Tôi có thể thực hiện mọi cuộc gọi đến link_to và thêm :target => '_blank', nhưng tôi muốn thực hiện nó trong một bước cho tất cả các liên kết, hiện tại và tương lai. Có cách nào tôi có thể khỉ vá link_to để có được hành vi mong muốn?Làm cách nào để tôi tạo liên kết_để mở các URL bên ngoài trong một cửa sổ mới?

+3

Vui lòng không làm điều này. Tôn trọng người dùng của bạn và để lại cho họ để quyết định cách họ muốn liên kết mở. –

+35

Đó là một ý tưởng hay, nhưng tôi nghĩ tôi sẽ tôn trọng các ông chủ của tôi và làm như tôi được bảo. – Simon

+4

đôi khi tốt hơn nên nói không với ông chủ của chúng tôi. Tôi đồng ý với John không làm điều này – shingara

Trả lời

4

Cuối cùng tôi đã đi với điều này, trong một 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

Trong Rails 4, '@ controller' không được xác định và cũng thiếu hỗ trợ https này. Dưới đây là các thay đổi https://gist.github.com/RoxasShadow/b5c59152183ff9ba0757/revisions. Cảm ơn bạn đã gửi đoạn mã btw. –

3

Bạn chỉ cần thêm một helper để thêm tùy chọn này trong link_to

của bạn Nếu bạn muốn thêm nó vào mỗi link_to để có thể thêm vào 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 

Hoặc bạn có thể tạo helper link_to của riêng bạn

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

Điều này cũng không thay đổi liên kết nội bộ? Có lẽ Simon chỉ nên sử dụng một số javascript để nhắm mục tiêu các liên kết bên ngoài? – monocle

+0

thay đổi tất cả các liên kết tạo ra bởi link_to helper. Bạn không thể làm nhiều hơn nữa. – shingara

17

Bạn không cần phải thay đổi mã phía máy chủ của mình cho vấn đề chế độ xem này.

Bạn nên sử dụng JavaScript không theo hướng dẫn. Ví dụ này sẽ chỉ làm cho các liên kết bên ngoài hiển thị trong một cửa sổ mới:

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

hoạt động hoàn hảo! Cảm ơn! – kibaekr

+0

rất đẹp! Cảm ơn bạn – Automatico

+0

Điều này gây ra sự cố cho tôi với các liên kết jquery –

1

Trong ray 3.2+, nó đã được thêm vào như một tùy chọn, chỉ cần thêm

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

và nó sẽ mở liên kết trong tab mới.

+1

Vấn đề không phải là cách làm cho một liên kết mở trong một cửa sổ mới; đó là cách làm cho tất cả các liên kết bên ngoài mở trong một cửa sổ mới. – Simon

Các vấn đề liên quan