主机中的Rails子域被替换

时间:2016-10-27 20:21:49

标签: ruby-on-rails ruby

鉴于以下config/routes.rb

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 - 但是对于多个子域/部署而言,这仍然有点痛苦。

2 个答案:

答案 0 :(得分:1)

您似乎需要检查tld_length

  

:tld_length - TLD ID组成的标签数量,仅在使用时使用   提供了:subdomain:domain。默认为   ActionDispatch :: Http :: URL.tld_length,它默认为1。

我将测试具体细节,但问题似乎Rails只允许tld(顶级域名)长度为1,这意味着您只能拥有一个子域名和1&#34 ;其他"元素(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)

创建config / initializers / host_name.rb文件,您可以在其中放置常量:

HOST_NAME = 'b.c'
然后

代码中的任何位置:

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

如果您愿意,也可以为子域创建常量