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如何设置子域值?
编辑
无论JDOE和coreyward与他们的答案正确.什么让我失望的是,我也在使用pow和xip.io访问该网站并得到相同的错误.这是奇怪,因为http://admin.app_name.192.168.1.68.xip.io/devices有一个顶级域名> 1.正在发生的事情是,子域xip是admin.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源代码.
尝试使用特殊地址:http://admin.lvh.me:3000/devices
或者设置:
config.action_dispatch.tld_length = 0
Run Code Online (Sandbox Code Playgroud)
在您的development.rb中重启您的应用.