2010-11-09 7 views
34

Ogni volta che un utente raggiunge la pagina sbagliata, rails mostra 404.html dalla cartella pubblica. Tuttavia, mi piacerebbe solo reindirizzare il browser alla pagina principale, senza mostrare nulla. Così ho provato a globbing, ma è venuto a nulla, mostra ancora la pagina 404. Ecco un estratto dal mio percorso file:Rails: reindirizza tutti i percorsi sconosciuti a root_url

# ... 
map.root :controller => 'home', :action => 'home' 
map.connect '*', :controller => 'home', :action => 'home' 

Qualche suggerimento? Grazie ragazzi!

+0

Suppongo che tu abbia un 'home_controller' che contiene l'azione 'home' che dice qualcosa come render: nothing => true? – jenjenut233

+0

No. C'è una home action nel controller domestico e c'è anche una vista home (home.html.erb). –

risposta

69

Se il progetto è alimentato da rotaie 3, aggiungere semplicemente questa riga al vostro routes.rb

match '*path' => redirect('/') 

Modifica: supporto Rails 4

match '*path' => redirect('/'), via: :get 
or 
get '*path' => redirect('/') 
+0

Grazie! Bene, è Rails 2.3.10 –

+0

Grazie a * lot *, amico! Lo ha fatto. Ecco come l'ho fatto in rails 2: 'map.connect '* percorso',: controller => 'home',: action => 'home'' Quindi, è il'' * percorso'' che era la chiave per l'intera cosa. Grazie ancora :-) –

+0

Puoi anche usare 'get' invece di' match', che è solo una scorciatoia per aggiungere 'tramite:: get'. – Peeja

1

È necessario creare un controller per farlo

class RedirectsController 

    def index 
    redirect_to root_url 
    end 
end 

E in vostri itinerari

map.connect '*', :controller => 'redirects', :action => 'index' 
+0

Questa risposta è anche per Rails 3? –

+0

Funziona anche con le guide 3. Hai solo bisogno di cambiare la ligne con la partita. Vedi globing nelle guide di routing – shingara

19

Come la risposta di Arkan. Un punto, se non si vuole questo comportamento in ambiente di sviluppo, quindi poteva fare -

match '*path' => redirect('/') unless Rails.env.development? 
10

Rails 4-

(routes.rb)

è comunque possibile utilizzare un semplice get a reindirizzare tutte le rotte sconosciute.

get '*path', to: 'home#index' 

Se si desidera fornire il routing sia POST e GET richieste è ancora possibile utilizzare la corrispondenza, ma Rails vuole di specificare il metodo di richiesta tramite via.

match "*path" => "home#index", via: [:get, :post] 

Ricordate che routes.rb viene eseguita in modo sequenziale (che corrisponde al primo percorso che si inserisce la struttura del percorso in dotazione), in modo da mettere jolly cattura in fondo i vostri abbinamenti.

+1

Grazie per l'avviso di metterlo in basso. – ahnbizcad

+0

Funziona ancora? Non sembra funzionare nella mia app Rails 4. –