Veel van mijn gebruikers blijven naar http://(rails app URL)/blog
gaan, 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')
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 app
parameter 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 /articles
op je frontend als een /articles
op 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