Rails路由约束问题/错误或功能?

时间:2019-02-19 19:37:07

标签: ruby-on-rails ruby-on-rails-5 rails-routing

我在GitHub上提出了此路由问题,但在那儿没有任何接受者,因此在这里吸引了很多人。

基本上,此问题与在较高阶constraints:的上下文中使用特定路径上的constraints:时有关。

https://github.com/rails/rails/issues/35295

1 个答案:

答案 0 :(得分:1)

内部约束覆盖外部约束。

关于此的一些github问题,例如https://github.com/rails/rails/pull/19075#issuecomment-92028613

因此,您的constraints: ->(request) { request.format.html? }“禁用”了constraints subdomain: 'admin',因此所有请求都直接转到匹配的第一个get '*path', to: 'home#show'

您可以轻松地进行测试,只需更改两者的顺序即可,并且您总是会以App::HomeController#show结尾。

如果您删除constraints: ->(request) { request.format.html? },则请求最终将在正确的控制器中出现,但随后会丢失强制的html。 对于这两个约束,您可以按照这些方法尝试。使用here中所述的约束模块。

module CustomAdminConstraint
  def self.matches? request
    request.subdomain.present? && request.subdomain == 'admin' && request.format.html?
    # possible short form
    # request.subdomain&.== 'admin' && request.format.html?
  end
end

module CustomAppConstraint
  def self.matches? request
    request.subdomain.present? && request.subdomain == 'app' && request.format.html?
  end
end

# routes.rb
constraints CustomAdminConstraint do
  namespace :admin, path: nil do
    get '*path', to: 'home#show'
  end
end

constraints CustomAppConstraintdo
  namespace :app, path: nil do
    get '*path', to: 'home#show'
  end
end

但是请注意,将来使用其他格式会比较棘手。 ew ...真骑