Эмулировать внешние интерфейсы как обычные маршруты контроллеров Rails
Фон: в начале был рельс монолитного рендеринга html-представления. Затем появилось приложение React для внешнего интерфейса и необходимость конвертировать бэкэнд в API JSON и генерировать URL-адреса (в основном в электронных письмах), указывающие на приложение внешнего интерфейса, которое ведет себя почти точно так же, как контроллер Rails.
Я искал способ подражать способу rails для создания URL-адреса, но вместо этого указывал на внешний URL-адрес и генерировал соответствующие path_helpers, которые можно было бы легко использовать с моим приложением, RSpec, cucumber / Capybara и всем остальным. Я нашел этот хак вокруг маршрутов для эмуляции маршрутов внешнего интерфейса, который также требует передачи дополнительного параметра для полного устранения неоднозначности внутренних маршрутов внешнего интерфейса VS (полезно при тестировании капибары)
frontend_scope = {
as: :frontend,
host: Rails.configuration.frontend_host, # like https://www.example.com
port: Rails.configuration.frontend_port, # 443
constraints: (lambda { |request| request.params[:app] == :frontend })
}
scope(frontend_scope) do
root to: 'static_pages_controller#home'
resources :articles, only: [:show, :index]
end
Тогда в моем коде Ruby я могу использовать
frontend_article_url(@article, app: :frontend)
frontend_articles_url(app: :frontend)
... (and everything that can be generated in a classic rails app)
Неудобно, что в вашем перенаправлении будет параметр app
, который вы должны будете игнорировать в своем веб-приложении + все другие веб-приложения, такие как Google Analytics, поисковая система и т. Д. *.
* проблема в том, что если у вас есть и /articles
на вашем внешнем интерфейсе, и /articles
на вашем бэкэнде, ваше приложение не сможет изменить ситуацию с обоими маршрутами, которые разрешают один и тот же URL без помощи дополнительного параметра