【问题标题】:Rails routes constraints issue/bug or feature?Rails 路由约束问题/错误或功能?
【发布时间】:2019-02-19 19:37:06
【问题描述】:

我在 GitHub 上提出了这个路由问题,但在那里没有发现任何接受者,所以在这里与人群联系。

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

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

【问题讨论】:

  • 我猜这个可以关了?
  • @DennyMueller 关闭了吗?但还没有人回答?

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


【解决方案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

但请注意,未来的其他格式实施起来会更加棘手。呸……真棒

【讨论】:

  • 我们也为来自 admin 子域的一些 API/JSON 请求提供服务,这就是为什么在约束模块中检查 .html? 对我们不起作用。
  • 然后完全移除外部约束,构建多个约束模块并直接添加到路径中。比如AdminJsonConstraintAdminHtmlConstraint等等。或者,如果您想保留外部约束,您可以为管理员制作 2 个约束块。一种用于 json,一种用于 html。
  • 有趣的是,我没有考虑在父 AdminConstraint 模块中添加 AdminHtmlConstraint 模块。让我试试,谢谢。
  • @kapso 好吧,如果你这样做,你将再次覆盖你的外部约束。和一开始一样的问题。此规则始终适用:Inner constraints overwrite outer constraints。您可以为 admin(html/json) / app(html/json) 设置几个外部约束。或者只为每个路径定义做约束。
猜你喜欢
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 2012-05-22
相关资源
最近更新 更多