web-dev-qa-db-fra.com

Création d'un itinéraire Rails vers une URL externe

Beaucoup de mes utilisateurs continuent à utiliser http://(Rails app URL)/blog, mais je n'ai pas de blog. J'ai enfin créé un blog Posterous et je souhaite maintenant y diriger mes utilisateurs. Est-il possible de configurer cela en utilisant routes.rb? Existe-t-il une meilleure façon de ne pas modifier le fichier httpd.conf?

45
Chris

Dépend de la version de Rails que vous utilisez.

Rails 3

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

Rails 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

Je sais que c'est vieux, donc si quelqu'un d'autre en a besoin pour Rails 4:

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

Utilisez get au lieu de Match dans Rails 4, sinon vous obtiendrez une erreur d'exécution

63
nil

Pour Rails 5:

récupère '/ stories', pour: rediriger ('/ articles')

obtenez '/ stories', pour: rediriger (' http://google.com ')

Page source du guide Rails

10
vitkoz

Émulation des itinéraires frontaux en tant qu’itinéraires réguliers du contrôleur Rails

Contexte: au début, il y avait un monolithe de Rails rendant la vue HTML. Vient ensuite une application frontale React, ainsi que la nécessité de convertir le backend en une API JSON et de générer des URL (la plupart du temps dans des courriels) pointant vers une application frontale qui se comporte presque comme un contrôleur Rails.

Je cherchais un moyen de reproduire la méthode de ressource Rails pour créer une URL, mais de pointer vers une URL frontale et de générer des path_helpers appropriés, qui pourraient être utilisés facilement avec mon application, RSpec, concombre/Capybara, etc. J'ai trouvé ce hack autour des routes pour émuler les routes frontales, ce qui nécessite également de passer un paramètre supplémentaire pour désambiguer complètement les routes backend VS frontend (utile dans les tests capybara)

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

Ensuite, dans mon code Ruby, je peux utiliser 

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

L'inconvénient est qu'il y aura un paramètre app dans votre redirection que vous devrez ignorer sur votre application frontale + toutes les autres applications Web telles que Google Analytics, le moteur de recherche, etc. *.

* Le problème étant que si vous avez à la fois un /articles sur votre interface et un /articles sur votre backend, votre application ne pourra pas faire la différence avec les deux routes qui se résolvent vers la même URL sans l'aide d'un paramètre supplémentaire

0
Cyril Duchon-Doris