Подтвердить что ты не робот

Создание маршрута рельсов на внешний URL

Многие из моих пользователей продолжают заходить на http://(rails app URL)/blog, но у меня нет блога. Я наконец-то настроил блог Posterous и теперь хочу направить туда своих пользователей. Есть ли способ настроить это с помощью rout.rb? Есть ли лучший способ, который не требует редактирования файла httpd.conf?

4b9b3361

Ответ 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

Ответ 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, без помощи дополнительных параметров.