2014-01-06 2 views
2

Я в процессе миграции приложения Rails 3 в Rails 4. Для нашего приложения у нас есть два домена верхнего уровня, которые мы используем для нашего английского сайта и японского сайта. Для того, чтобы динамически ссылки на соответствующий сайт, мы расширяли url_for как следующиеВключение в url_for с Rails 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 - для относительного пути. –

Смежные вопросы