鉴于以下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
- 但是对于多个子域/部署而言,这仍然有点痛苦。
答案 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')
如果您愿意,也可以为子域创建常量