使用Rails 4连接到url_for

时间:2014-01-06 05:23:35

标签: ruby-on-rails

我正在将Rails 3应用程序迁移到Rails 4.对于我们的应用程序,我们有两个顶级域名,我们用于我们的英语站点和日语站点。为了动态链接到相应的站点,我们扩展了url_for,如下所示

module I18nWwwUrlFor
  def url_for(options=nil)
    if options.kind_of?(Hash) && !options[:only_path]
      if %r{^/?www} =~ options[:controller]
        options[:host] = i18n_host
      end
    end
    super
  end
end

OurApplication::Application.routes.extend I18nWwwUrlFor

在Rails 4下,这不起作用。这是因为命名路由现在直接调用ActionDispatch :: Http :: URL.url_for,它接受选项并生成URL。理想情况下,我想扩展这个url_for,但是没有任何钩子可以这样做,所以我使用alias_method_chain进行猴子修补。我错过了什么,有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我将以下内容用于带子域的Rails 4应用程序:

module UrlHelper
  def url_for(options = nil)
    if options.is_a?(Hash) && options.has_key?(:subdomain)
      options[:host] = host_with options.delete(:subdomain)
    end
    super
  end

  def host_with(subdomain)
    subdomain += '.' unless subdomain.blank?
    [ subdomain, request.domain, request.port_string ].join
  end
end

确保在application_controller.rb中正确包含帮助程序,否则它将无法在控制器和视图中使用。

include UrlHelper
helper UrlHelper

如果要更改子域,请指定子域。

root_path(subdomain: 'ja')