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

Sim*_*mon 19 ruby-on-rails

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

Nic*_*nco 17

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

你应该使用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;
    }
  });
});
Run Code Online (Sandbox Code Playgroud)


Sim*_*mon 4

最后我在初始化程序中采用了这个:

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
Run Code Online (Sandbox Code Playgroud)