2016-10-27 2 views
1

Учитывая следующие config/routes.rb:Rails Subdomain в узле сети Заменено

constraints subdomain: 'subdomain' do 
    get 'path', to: 'main#index', as: :sample 
end 

следующие работы:

Rails.application.routes.url_helpers.sample_url(host: "a.b") 
# "http://subdomain.a.b/path" 

возникновения ошибки:

Rails.application.routes.url_helpers.sample_url(host: "a.b.c") 
# "http://subdomain.b.c/path" 

Любой способ исправить это так субдоменов не заменяйте существующие поддомены в хосте, а вместо этого связаны (т.е. http://subdomain.a.b.c/path)? Я понимаю, что я могу изменить субдомен в маршруте на subdomain.a - но это будет немного больно для поддержки нескольких поддоменов/развертываний.

+0

В качестве примечания, если вы вызываете субдомены, вы можете использовать помощники '_url', а не' _path'. EG 'sample_url (: args)' - сохранит вызов 'Rails.application.routes ...' –

+1

@RichardPeck yup - но вам нужно префикс с помощью 'Rails.application.routes.url_helpers', если вы вызываете с консоли , Обратите внимание, что пример используется с помощью помощников '_url'. –

+0

Да, конечно, я не понимал, что вы делаете это с cmd. –

ответ

1

Похоже, вам необходимо изучить tld_length:

:tld_length - Количество ярлыков идентификатор TLD, состоящий из, только если :subdomain или :domain. По умолчанию ActionDispatch :: Http :: URL.tld_length, который в свою очередь по умолчанию в 1.

Я проверить специфику, но вопрос выглядит Rails только позволяя (домен верхнего уровня) Длина tld из 1, что означает, что вы можете иметь только субдомен и 1 «другой» элемент (subdomain.b.c/subdomain.a.b).

Исправление должно быть расширение tld_length, которое в соответствии с this answer, можно сделать в настройках конфигурации /config/application.rb:

# config/application.rb 
config.action_dispatch.tld_length = 2 

Тесты

Без tld_length:

c:\Dev\Apps\torches>rails c 
Loading development environment (Rails 5.0.0.1) 
irb(main):001:0> Rails.application.routes.url_helpers.sample_url(host: "a.b") 
=> "http://subdomain.a.b/path" 
irb(main):002:0> Rails.application.routes.url_helpers.sample_url(host: "a.b.c") 
=> "http://subdomain.b.c/path" 
irb(main):003:0> 

С tld_length:

c:\Dev\Apps\torches>rails c 
Loading development environment (Rails 5.0.0.1) 
irb(main):001:0> Rails.application.routes.url_helpers.sample_url(host: "a.b") 
=> "http://subdomain.a.b/path" 
irb(main):002:0> Rails.application.routes.url_helpers.sample_url(host: "a.b.c") 
=> "http://subdomain.a.b.c/path" 
irb(main):003:0> 
+1

Спасибо! Именно то, что я искал! –

0

создать конфигурационный/инициализаторы/файл host_name.rb, где вы можете разместить постоянный:

HOST_NAME = 'b.c' 

затем в любом месте вашего кода:

Rails.application.routes.url_helpers.sample_url(host: HOST_NAME, subdomain: 'subdomain.a') 

вы также можете создать константы для субдоменов, если это Вам нравится