ti-enxame.com

Criando uma rota Rails para um URL externo

Muitos dos meus usuários continuam indo para http://(Rails app URL)/blog, mas na verdade eu não tenho um blog. Eu finalmente configurei um blog Posterous e agora quero direcionar meus usuários para lá. Existe uma maneira de configurar isso usando routes.rb? Existe uma maneira melhor que não envolve editar o arquivo httpd.conf?

45
Chris

Depende da versão do Rails que você está usando.

Trilhos 3

# in routes.rb
match "/blog" => redirect("http://example.com/blog"), :as => :blog

Trilhos 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
59
Marcel Jackwerth

Eu sei que isso é antigo, então no caso de alguém precisar disso para o Rails 4:

get "/blog" => redirect("http://example.com/blog")

Use get em vez de Match in Rails 4, caso contrário você receberá um erro Runtime

63
nil

Para Rails 5:

get '/ stories', to: redirect ('/ articles')

obtenha '/ stories' para: redirect (' http://google.com ')

Página fonte do Rails Guide

10
vitkoz

Emular rotas front-end como rotas regulares do controlador Rails

Antecedentes: no início, havia o monolito do Rails exibindo o html. Em seguida, veio um aplicativo React frontend e a necessidade de converter o backend para uma API JSON e gerar URLs (principalmente em emails) apontando para um aplicativo frontend que se comporta quase exatamente como um controlador Rails.

Eu estava procurando uma maneira de imitar a maneira de recursos do Rails para construir URL, mas para apontar para uma URL frontend e gerar path_helpers apropriados, que poderiam ser usados ​​facilmente com meu aplicativo, RSpec, pepino/capivara e tudo mais. Eu encontrei este hack em torno de rotas para emular rotas front-end, o que também requer um parâmetro extra a ser passado para desambiguar completamente as rotas back-end de backend (útil no teste de capivaras)

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

Então no meu código Ruby eu posso usar 

frontend_article_url(@article, app: :frontend)
frontend_articles_url(app: :frontend)
... (and everything that can be generated in a classic Rails app)

O inconveniente é que haverá um parâmetro app no seu redirecionamento, que você teria que ignorar no seu aplicativo frontend + em todos os outros aplicativos da web, como o Google Analytics, o mecanismo de pesquisa etc. *.

* o problema é que, se você tiver um /articles em seu frontend e um /articles em seu back-end, seu aplicativo não poderá fazer a diferença com as duas rotas que resolvem o mesmo URL sem a ajuda de um parâmetro extra

0
Cyril Duchon-Doris