【问题标题】:Multiple 'root to' routes in rails 4.0rails 4.0中的多个“根到”路由
【发布时间】:2013-10-04 00:50:01
【问题描述】:

我正在尝试根据子域让 Rails 转到不同的控制器#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 认为子域不存在,即使它存在。我想知道是不是因为我在做这个本地主机。

【问题讨论】:

  • 为什么要加载一个主页,然后在控制器上进行重定向
  • @mZaragoza ,我不遵循您的建议。你能再解释一下吗?
  • 我可以使用任何子域访问您的应用程序。应用程序控制器加载并从那里您可以确定我来自哪个子域,然后您可以将我重定向到正确的位置
  • @mZaragoza,是的,我可以这样做,但对我来说这就像一个黑客。如果 rails 有办法使用内置路由机制进行路由,我宁愿使用它。
  • 我同意,但我不知道您是否可以在路线文件中做出决定

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

更新答案:

在 Rails 3 和 4 上为我工作:

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

【讨论】:

  • 不走运..它总是尝试为每一件事路由到 custom#show :(
  • 查看我的更新答案。在我的本地机器上工作。转到localhost 将我带到与转到test.localhost 不同的页面。
  • 嗯,这是我之前尝试过的,但没有运气......你在 Rails 4.0 上吗?
  • 我修改了 Rails 4 的答案(获取而不是匹配),现在它适用于 Rails 3 和 4。
  • 啊哈!!!!你的正则表达式用单引号括起来,所以它被处理为字符串而不是正则表达式。复制我的不带单引号的代码,它应该可以工作。
【解决方案2】:

@manishie 的回答是正确的,但如果您使用 localhost,您的 devo 环境中仍然可能会遇到问题。要修复它,将以下行添加到config/environments/development.rb

config.action_dispatch.tld_length = 0

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

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

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

【讨论】:

    【解决方案3】:

    由于某种原因,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中的更多信息

    【讨论】:

      猜你喜欢
      • 2014-06-25
      • 2012-04-14
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多