在条件路由期间,未在Rails 3中设置request.subdomain

Gav*_*ler 5 ruby subdomain routing ruby-on-rails ruby-on-rails-3

我试图在子域名上按照Ryan Bates的截屏设置Rails 3中的子域名.但它不适合我.我有以下设置:

# routes.rb
constraints(Subdomain) do
  get 'devices' => 'devices#all'
end

# lib/subdomain.rb
class Subdomain
  def self.matches?(request)
    # binding.pry
    request.subdomain.present? && request.subdomain == "admin"
  end
end
Run Code Online (Sandbox Code Playgroud)

加载网址admin.localhost:3000/devices应该路由我devices#all,但是我收到路由错误Routing Error No route matches [GET] "/devices"显然我的路由无法正常工作.

我设置了一个pry调试会话,其中注释在上面,它被命中,所以我的约束工作,但我得到以下输出:

[1] pry(Subdomain)> request.subdomain
=> ""
[2] pry(Subdomain)> request.subdomains
=> []
[3] pry(Subdomain)> request.host
=> "admin.localhost"
Run Code Online (Sandbox Code Playgroud)

因此rails不会获取url的admin部分并将其放入子域变量中.虽然我可以轻松地使用主机值过滤到管理路由,但我想保持清洁和正确.

rails如何设置子域值?


编辑

无论JDOEcoreyward与他们的答案正确.什么让我失望的是,我也在使用powxip.io访问该网站并得到相同的错误.这是奇怪,因为http://admin.app_name.192.168.1.68.xip.io/devices有一个顶级域名> 1.正在发生的事情是,子域xipadmin.app_name.192.168.1.68,这也给失败的匹配逻辑和不路由.

cor*_*ard 11

因为就Rails而言,没有子域.

Rails希望您为超过1个点的TLD 提供顶级域名(TLD)长度.例如,如果您拥有bbc.co.uk它将"bbc"作为子域,除非您指定TLD长度为2,在这种情况下子域将为空:

request.subdomain(2) #=> ""
Run Code Online (Sandbox Code Playgroud)

这也是你看到subdomains返回一个空数组的原因:最后两个段被自动丢弃.您可以指定0TLD长度来获取"admin",但该代码将在生产中使用真实域名中断,因此我不推荐它.

我建议使用admin.yourapp.dev之类的域名,通过localhost将其路由回您的计算机,以使您的应用程序正确检测子域名.只需编辑/ etc/hosts即可.

如果你很好奇,这里是该subdomain方法的Rails源代码.


jdo*_*doe 6

尝试使用特殊地址:http://admin.lvh.me:3000/devices

或者设置:

config.action_dispatch.tld_length = 0
Run Code Online (Sandbox Code Playgroud)

在您的development.rb中重启您的应用.