2011-01-08 23 views
7

Ho un'app per rails che ho creato per un vecchio sito che ho convertito da un altro cms (in un linguaggio non-rails, hehe). La maggior parte delle vecchie pagine sono mappate alle nuove pagine usando routes.rb. Ma ci sono ancora alcuni 404.Rails - qualche modo elegante per gestire 404s?

Sono un binario newb quindi sto chiedendo se ci sono modi avanzati per gestire 404s. Ad esempio, se stavo programmando nella mia vecchia lingua, lo farei:

  • Ottenere l'URL (nome_script) a cui si stava accedendo e analizzarlo.
  • Effettuare una ricerca nel database per qualsiasi parola chiave, id, ecc trovato nel nuovo URL.
  • Se trovato, reindirizzare alla pagina (o se vengono trovati più record, mostrarli tutti in una pagina dei risultati e consentire all'utente di scegliere). Con le rotaie che probabilmente vorrei fare: status =>: spostato_permanente sto indovinando?
  • Se non viene trovato, mostrare un 404.

Ci sono delle gemme/plugins o tutorial si sa di che sarebbe gestire una cosa del genere, se è ancora possibile. Oppure puoi spiegare ad alto livello come si può fare? Non ho bisogno di un campione completo di codice, solo una spinta nella giusta direzione.

PS. È una semplice app per rails 3 che utilizza un singolo modello di contenuto.

+0

Informazioni sui tuoi "P.S.", i modelli non hanno nulla, davvero nulla a che fare con il routing. I controllori si prendono cura di questo. :) –

risposta

7

mettere questo in percorsi (dopo ogni altra via che avete, questo catturerà ogni url)

match '*url' => 'errors#routing' 

E ora in controllo errori di routing azione è possibile implementare qualsiasi logica di fantasia che si desidera, e rendono una vista come sempre (potresti voler aggiungere :status => 404 alla chiamata render). L'URL richiesto sarà disponibile nel controller come params[:url].

+0

Wicked, questo è proprio quello che stavo cercando per farmi andare nella giusta direzione. Grazie molto! – jyoseph

0

C'è un modo brutto di fare questo:

render :file => "#{RAILS_ROOT}/public/404.html", :layout => false, :status => 404 

Forse qualcuno può venire con una soluzione migliore.

Problemi correlati