2014-01-06 58 views
2

我正在將Rails 3應用程序遷移到Rails 4.對於我們的應用程序,我們有兩個頂級域用於我們的英文網站和日文網站。要動態鏈接到相應的網站,我們正在擴展url_for,如下所示用Rails連接到url_for 4

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

我用於與子域名的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') 
+0

嗯,只有_path助手調用url_for。我們正在使用_url,它不再通過url_for。所以root_path會像你顯示的那樣工作,但是root_url不會。 –

+0

你使用'_url'方法的任何原因? – AJcodez

+0

因爲通常在需要完整URL時使用_url,而_path是針對相對路徑。 –