我在GitHub上提出了此路由问题,但在那儿没有任何接受者,因此在这里吸引了很多人。
基本上,此问题与在较高阶constraints:
的上下文中使用特定路径上的constraints:
时有关。
答案 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 ...真骑