Подтвердить что ты не робот

Как создать ссылку для открытия внешних URL-адресов в новом окне?

Мне нужно преобразовать сайт rails 2.3, чтобы все внешние URL-адреса открывались в новом окне. Я мог бы пройти каждый вызов до link_to и добавить :target => '_blank', но я хотел бы сделать это за один шаг для всех ссылок, настоящего и будущего. Есть ли способ, с помощью которого я могу установить привязку обезьяны link_to, чтобы получить желаемое поведение?

4b9b3361

Ответ 1

В конце я пошел с этим, в инициализаторе:

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

Ответ 2

Вам не нужно менять код на стороне сервера для этой проблемы.

Вы должны использовать 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;
    }
  });
});

Ответ 3

Вы просто добавляете помощника, чтобы добавить эти параметры в свой link_to

Если вы хотите добавить его на каждый 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 helper

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

Ответ 4

В rails 3.2+ он добавлен в качестве опции, просто добавьте

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

и он откроет ссылку на новой вкладке.