如何在新窗口中使link_to打开外部URL?

我需要转换rails 2.3站点,以便在新窗口中打开所有外部URL。 我可以通过每次调用link_to并添加:target => '_blank' ,但我想在所有链接,现在和未来的一步中完成。 有没有办法我可以修补link_to以获得所需的行为?

您不必为此视图问题更改服务器端代码。

你应该使用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; } }); }); 

最后,我在初始化器中使用了这个:

 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 

您只需添加一个帮助程序即可在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帮助程序

 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 

在rails 3.2+中,它已作为选项添加,只需添加

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

它将在新标签中打开链接。