Как мне сделать link_to, чтобы открыть внешние URL в новом окне? - PullRequest
19 голосов
/ 03 ноября 2010

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

Ответы [ 4 ]

17 голосов
/ 03 ноября 2010

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

Вы должны использовать 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;
    }
  });
});
4 голосов
/ 30 ноября 2010

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

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
3 голосов
/ 03 ноября 2010

Вы просто добавляете помощника для добавления этих опций в ваш 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.помощник

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
1 голос
/ 10 декабря 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...