我在GitHub上提出了这个路由问题,但没有在那里找到任何接收者,所以在这里向人群伸出援手。
基本上,这个问题涉及特定路线上的constraints:
何时在更高阶constraints:
的背景下使用。
内部约束覆盖外部约束。
关于这一点有几个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
但请注意,未来的其他格式实施起来比较棘手。 Phew ......真是个好车