Многие из моих пользователей продолжают заходить на http://(rails app URL)/blog
, но у меня нет блога. Я наконец-то настроил блог Posterous и теперь хочу направить туда своих пользователей. Есть ли способ настроить это с помощью rout.rb? Есть ли лучший способ, который не требует редактирования файла httpd.conf?
Создание маршрута рельсов на внешний URL
Ответ 1
Зависит от используемой версии Rails.
Рельсы 3
# in routes.rb
match "/blog" => redirect("http://example.com/blog"), :as => :blog
Рельсы 2
# in routes.rb
map.blog '/blog',
:controller => "a_helper_controller",
:action => "redirect_to_blog"
# in a_helper_controller.rb
def redirect_to_blog
redirect_to "http://example.com/blog"
end
Ответ 2
Я знаю, что это старо, поэтому, если кому-то это понадобится для рельсов 4:
get "/blog" => redirect("http://example.com/blog")
Используйте get вместо Match in Rails 4, иначе вы получите ошибку Runtime
Ответ 3
Для Rails 5:
get '/stories', to: redirect('/articles')
get '/stories', to: redirect('http://google.com')
Ответ 4
Эмулируйте маршруты внешнего интерфейса как обычные маршруты контроллера Rails
Предыстория: в начале был рельс монолитного рендеринга html view. Затем появилось приложение 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, без помощи дополнительных параметров.