Проблема / ошибка или функция ограничений маршрутов Rails? - PullRequest
0 голосов
/ 19 февраля 2019

Я поднял эту проблему маршрутизации на GitHub, но не нашел там ни одного получателя, поэтому обращаюсь к толпе здесь.

В основном проблема связана с тем, когда constraints: на конкретном маршруте используется в контексте более высокого порядка constraints:.

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

1 Ответ

0 голосов
/ 24 февраля 2019

Внутренние ограничения перезаписывают внешние ограничения.

В связи с этим существует несколько проблем с 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.Для обоих ограничений вы можете попробовать что-то в этом роде.Используйте модули ограничений, как описано здесь .

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

Но имейте в виду, что в будущем другие форматы сложнее реализовать.Фу ... какая поездка

...