2011-01-08 9 views
7

Mam aplikację szyny, którą zbudowałem dla starej witryny, którą przekonwertowałem z innego cm (w języku nie-szyny, hehe). Większość starych stron jest mapowana do nowych stron za pomocą routes.rb. Ale wciąż jest kilka 404.Szyny - jakieś wymyślne sposoby obsługi 404?

Jestem nowicjuszem, więc pytam, czy istnieją jakieś zaawansowane sposoby radzenia sobie z 404. Na przykład, jeśli programowałem w moim starym języku, robiłbym to:

  • Uzyskaj adres URL (nazwa skryptu), do którego uzyskiwany był dostęp i parsuj go.
  • Wykonaj wyszukiwanie w bazie danych dla wszystkich słów kluczowych, identyfikatorów itp. Znalezionych w nowym adresie URL.
  • Jeśli zostanie znaleziony, przekieruj stronę (lub jeśli znaleziono wiele rekordów, pokaż je wszystkie na stronie wyników i pozwól użytkownikowi wybrać). Z szynami, które prawdopodobnie chciałbym zrobić: status =>: move_permanently Zgaduję?
  • Jeśli nie znaleziono, pokazać 404.

Czy istnieją jakieś klejnoty/plugins lub samouczki znasz która będzie obsługiwać takie rzeczy, czy to w ogóle możliwe. Czy możesz wyjaśnić na wysokim poziomie, jak można to zrobić? Nie potrzebuję pełnej próbki kodu, tylko popchnięcie we właściwym kierunku.

PS. Jest to prosta aplikacja rails 3, która korzysta z jednego modelu Content.

+0

Modele "P.S." nie mają nic wspólnego z routingiem. Kontroli to zajmują. :) –

Odpowiedz

7

umieścić to w trasach (po każdej innej trasie, że masz, to będzie uchwycić każdy URL)

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

a teraz w sterowniku błędów w działaniu można wdrożyć wszelkie fantazyjne logiki, który chcesz routingu i renderowanie widok jak zawsze (możesz dodać :status => 404 do połączenia render). Żądany adres URL będzie dostępny w kontrolerze jako params[:url].

+0

Wicked, właśnie tego szukałem, aby skierować mnie we właściwym kierunku. Wielkie dzięki! – jyoseph

0

Jest brzydki sposób to zrobić:

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

Może ktoś może pochodzić z lepszego rozwiązania.

Powiązane problemy