2010-12-27 7 views
4

Ich habe eine alte Site in Coldfusion gebaut, eine neue Site in Rails gebaut. Ich möchte die alten URLs auf die neuen URLs umleiten. Ich bin mir nicht sicher, ob Routen der richtige Weg sind oder nicht (ich bin ein Noob). Die URLs werden sich sehr ähneln. Das sollte einfach sein, aber ich bin mir nicht sicher über die beste Methode.Rails mit routes.rb um alte URLs umzuleiten

Alte URL:

mysite.com/this-is-the-slug-right-here/ 

Neue URL:

mysite.com/blog/this-is-the-slug-right-here 

Hier ist das Problem, ich habe 3 "Inhaltstypen". Die alte Site-URL unterscheidet nicht zwischen den Inhaltstypen. Die neue Rails-Website verfügt über einen Controller für jeden der Inhaltstypen: Blog, Foto, Mobiles Foto.

Also im obigen Beispiel ist /blog/ der Controller (Inhaltstyp) und this-is-the-slug-right-here ist der Permalink oder Slug für den Inhalt. Die ich so bin immer:

@content = Content.where(:permalink => params[:id]).first 

Soll ich routes.rb verwenden, oder muss ich eine Art von Catch-all-Skript? Jede Hilfe, um mich in die richtige Richtung zu weisen, wäre sehr willkommen. Hier ist ein Blog-Post


bearbeiten weiter

zu klären: http://jyoseph.com/treadmill-desk-walk-this-way/

Die neue URL für diese wäre /blog/treadmill-desk-walk-this-way, weil es eine Art des Inhalts von Blog.

Und ein Foto Beitrag: http://jyoseph.com/berries/

Die neue URL für diese /photos/berries sein würde, weil es sich um eine Art des Inhalts des Bildes ist. Der Inhaltstyp ist ein Attribut im Inhaltsmodell, das im Attribut content_type gespeichert ist.


Hier ist meine routes.rb Datei:

resources :contents 
match 'mophoblog/:id', :to => 'mophoblog#show' 
match 'photos/:id', :to => 'photos#show' 
match 'blog/:id', :to => 'blog#show' 

root :to => "index#index" 
match ':controller(/:action(/:id(.:format)))' 

Verstanden @ Zeichen Antwort verwenden, hier ist was ich mit endete.

in meinem routes.rb

match ':id' => 'contents#redirect', :via => :get, :as => :id 

in meinem Inhalt Controller:

def redirect 
    @content = Content.where(:permalink => params[:id]).first 
    if @content.content_type.eql?('Photo') 
    redirect_to "/photos/#{@content.permalink}", :status => :moved_permanently 
    elsif @content.content_type.eql?('Blog') 
    redirect_to "/blog/#{@content.permalink}", :status => :moved_permanently 
    elsif @content.content_type.eql?('MoPhoBlog') 
    redirect_to "/mophoblog/#{@content.permalink}", :status => :moved_permanently 
    end 
end 

Ich bin sicher, dass dies verbessert werden könnte, und zwar so, wie ich bin Umleitung, aber das mein Problem gelöst perfekt.

+0

In einer URL wie 'mysite .com/this-is-the-slug-right-here/', welcher Teil erlaubt es deinem Redirector, Blogs von Pix usw. zu unterscheiden? – Eric

+0

Welcher Teil der aktuellen Coldfusion-Site? Ich verwende isapi_rewrite mit einer httpd.ini-Datei. In der neuen und alten Site wird der Inhalt alle in derselben Tabelle gespeichert und sie sind nach Typ getrennt. – jyoseph

Antwort

4

Sie können routes.rb nicht dazu verwenden, es ist jedoch einfach genug, um eine Route einzurichten, den Inhaltstyp zu erhalten und umzuleiten.

Etwas wie:

routes.rb 
match.resources :photos 
match.resources :mobile_photos 
match.resources :blog 
#everything_else all resource and named routes before 
match ':article_id' => 'articles#redirect', :via => :get, :as => :article_redirect 

#articles_controller.rb 
def redirect 
    @content = Content.find params[:id] 
    if @content.content_type.eql?('photo') 
    redirect_to photo_path(@content), :status => :moved_permanently 
    elsif @content.content_type.eql?('mobile_photo') 
    redirect_to mobile_photo_path(@content), :status => :moved_permanently 
    ... 
end 

mir Jetzt kommt es während ich dies schreibe, dass Sie wahrscheinlich nur ein Controller für all dies wollen?

+0

Das ist genau so, wie ich es mir vorgestellt habe. z.B. Abrufen des Inhalts, Ermitteln des Inhaltstyps und Erstellen der URL (mithilfe von/contenttype/permalink oder Umleiten wie bei Ihnen). Wenn ich den Beispielcode implementiere, bekomme ich "No route matches/foo", wobei "foo" die URL ist, auf die Sie zugreifen möchten. Ich werde die Frage mit dem Inhalt meiner Routes-Datei aktualisieren, bevor ich Änderungen vornehme. Danke für Ihre Hilfe! – jyoseph

+0

Beachten Sie, dass ich einen Tippfehler in der Weiterleitungsroute hatte, die ich korrigiert habe, dh. Übereinstimmung ': article_id' war Übereinstimmung 'article_id'. – mark

+0

abgelehnt, da es jetzt veraltet ist. https://stackoverflow.com/a/45190672/203673 ist jetzt eine bessere Antwort. – drewish

2

dachte nur Menschen einer Lösung interessiert sein könnte, eine allgemeinere Umleitung zu tun:

redirector = lambda do |env| 
    path = env['action_dispatch.request.path_parameters'][:path] 
    redirect("/new-url-base#{path}").call(env) 
end 

match 'old-url-base:path' => redirector, :constraints => {:path => /.*/} 

redirect() gibt nur eine einfache Rack-Anwendung, die die Redirect-Header zurückgibt, so dass es in einem Lambda-Verpackung können Sie ändern die Argumente dazu. Es wäre wahrscheinlich besser für die Wartung es stattdessen in einem Objekt einpacken:

match 'old-url-base:path' => Redirector.new("new-url-base", :path), :constraints => {:path => /.*/} 
Verwandte Themen