gpt4 book ai didi

ruby-on-rails - 在条件路由期间未在 Rails 3 中设置 request.subdomain

转载 作者:数据小太阳 更新时间:2023-10-29 07:09:37 26 4
gpt4 key购买 nike

我正在尝试根据 Ryan Bates screencast on subdomains 在 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

加载 url admin.localhost:3000/devices 应该将我路由到 devices#all,但是我收到路由错误 Routing Error No route matches [ GET] "/devices" 显然我的路由不工作。

我设置了一个 pry 调试 session ,上面的注释被命中,所以我的约束有效,但我得到以下输出:

[1] pry(Subdomain)> request.subdomain
=> ""
[2] pry(Subdomain)> request.subdomains
=> []
[3] pry(Subdomain)> request.host
=> "admin.localhost"

因此,rails 不会选取 url 的管理部分并将其放入子域变量中。虽然我可以很容易地只使用主机值来过滤到管理路由,但我希望保持干净和正确。

rails 为什么不设置子域值?


编辑

两者都是jdoecoreyward他们的答案是正确的。让我失望的是,我还使用了 powxip.io 来访问该站点并遇到了同样的错误。这很奇怪,因为 http://admin.app_name.192.168.1.68.xip.io/devices 有一个 tld > 1。发生的事情是 xip 的子域是 admin.app_name.192.168.1.68,它也因匹配逻辑而失败并且没有路由。

最佳答案

因为就 Rails 而言,不存在子域。

Rails 希望您提供 Top-Level Domain (TLD) 超过 1 个点的 TLD 的长度。例如,如果您有 bbc.co.uk,它将选择“bbc”作为子域,除非您指定 TLD 长度为 2,在这种情况下子域将为空:

request.subdomain(2) #=> ""

这也是您看到 subdomains 返回一个空数组的原因:最后两个段被自动丢弃。您可以将 0 指定为 TLD 长度以返回“admin”,但该代码会在使用真实域名的生产环境中中断,因此我不推荐这样做。

我建议使用像 admin.yourapp.dev 这样的域,它通过本地主机路由回您的计算机,以使您的应用正确检测子域。只需编辑/etc/hosts 即可。

如果你好奇,here is the Rails source for the subdomain method .

关于ruby-on-rails - 在条件路由期间未在 Rails 3 中设置 request.subdomain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11056511/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com