6

我试图让rails根据子域转到不同的controller#action,这就是我目前在routes.rb中所拥有的

Petworkslabs::Application.routes.draw do

  get '/', to: 'custom#show', constraints: {subdomain: '/.+/'}, as: 'custom_root'
  get '/',  to: "welcome#home", as: 'default_root'
end

rake 显示了我希望它采取的正确路线

rake routes
      Prefix Verb   URI Pattern             Controller#Action
 custom_root GET    /                       custom#show {:subdomain=>"/.+/"}
default_root GET    /                       welcome#home

但由于某种原因,我无法获得像 abc.localhost:3000 这样的请求来访问自定义控制器。它总是将它路由到welcome#home。有任何想法吗?我对 Rails 相当陌生,所以任何关于一般调试的提示也将不胜感激。

编辑:我使用调试器逐步完成了代码,这就是我发现的

(rdb:32) request.domain "abc.localhost" (rdb:32) request.subdomain "" (rdb:32) request.subdomain.present? 错误的

看起来出于某种原因,rails 认为子域不存在,即使它存在。我想知道是不是因为我正在做这个本地主机。

4

3 回答 3

7

更新答案:

在 Rails 3 和 4 上为我工作:

get '/' => 'custom#show', :constraints => { :subdomain => /.+/ }
root :to => "welcome#home"
于 2013-10-04T01:30:24.697 回答
2

@manishie 的回答是正确的,但是如果您使用localhost. 要修复它,将以下行添加到config/environments/development.rb

config.action_dispatch.tld_length = 0

然后使用@manishie 的答案routes.rb

get '/' => 'custom#show', :constraints => { :subdomain => /.+/ }
root :to => "welcome#home"

问题是 tld_length 默认为 1,并且当您使用 localhost 时没有域扩展名,因此 rails 无法获取子域。pixeltrix 在这里解释得很好:https ://github.com/rails/rails/issues/12438

于 2017-03-04T19:10:00.167 回答
1

由于某种原因, request.subdomain 根本没有被填充(我怀疑这是因为我在 localhost 上这样做了,我在这里打开了一个错误https://github.com/rails/rails/issues/12438)。这导致 routes.rb 中的正则表达式匹配失败。我最终创建了自定义匹配项?看起来像这样的子域的方法

class Subdomain
  def self.matches?(request)

    request.domain.split('.').size>1 && request.subdomain != "www"
  end
end

并将其连接到 routes.rb

constraints(Subdomain) do
  get '/',  to: "custom#home", as: 'custom_root'
end

这似乎有效。

编辑:github问题页面中的更多信息https://github.com/rails/rails/issues/12438

于 2013-10-04T01:28:36.020 回答