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