Een spoorroute maken naar een externe URL

Veel van mijn gebruikers blijven naar http://(rails app URL)/bloggaan, maar ik heb eigenlijk geen blog. Ik heb eindelijk een Posterous-blog opgezet en wil mijn gebruikers daar nu naartoe leiden. Is er een manier om dit te configureren met routes.rb? Is er een betere manier om het httpd.conf-bestand niet te bewerken?


Antwoord 1, autoriteit 100%

Ik weet dat dit oud is, dus voor het geval iemand anders dit nodig heeft voor rails 4:

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

Gebruik get in plaats van Match in Rails 4, anders krijg je een Runtime-fout


Antwoord 2, autoriteit 96%

Afhankelijk van de Rails-versie die u gebruikt.

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

Antwoord 3, autoriteit 29%

Voor rails 5:

get '/stories', to: redirect('/articles')
get '/stories', to: redirect('http://google.com')

Bronpagina Rails Guide


Antwoord 4, autoriteit 6%

Emuleer frontend-routes als reguliere Rails-controllerroutes

Achtergrond: in het begin was er Rails monolith rendering html view. Toen kwam een ​​frontend React-app en de noodzaak om de backend naar een JSON-api te converteren en URL’s te genereren (meestal in e-mails) die verwijzen naar een frontend-app die zich bijna precies als een Rails-controller gedraagt.

Ik was op zoek naar een manier om de rails-resourcemanier na te bootsen om URL te construeren, maar om in plaats daarvan naar een frontend-URL te verwijzen en geschikte path_helpers te genereren, die gemakkelijk kunnen worden gebruikt met mijn app, RSpec, komkommer/Capybara en al het andere. Ik vond deze hack rond routes om frontend-routes te emuleren, waarvoor ook een extra parameter moet worden doorgegeven om frontend VS backend-routes volledig ondubbelzinnig te maken (handig bij capybara-tests)

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

Dan kan ik in mijn Ruby-code gebruiken

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

Het vervelende is dat er een appparameter in uw omleiding zal zijn, die u zou moeten negeren in uw frontend-app + alle andere web-apps zoals Google Analytics, zoekmachine, enz.*.

* het probleem is dat als je zowel een /articlesop je frontend als een /articlesop je backend hebt, je app dit niet kan maak het verschil met beide routes die naar dezelfde URL leiden zonder de hulp van een extra parameter. Als je je fullstack-app converteert naar een Rails API, of als je dezelfde routes ook nodig hebt om prerendering/meta voor SEO af te handelen, kan dit een probleem zijn, anders moet dit grotendeels worden geannuleerd door een /api/-prefix

Other episodes