2010-11-09 30 views
34

Chaque fois qu'un utilisateur atteint la mauvaise page, rails affiche 404.html à partir du dossier public. Cependant, je voudrais simplement rediriger le navigateur vers la page racine, sans montrer quoi que ce soit. J'ai donc essayé de globbing, mais est venu en vain, il montre toujours la page 404. Voici un extrait de mon fichier de routes:Rails: rediriger toutes les routes inconnues vers root_url

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

Des suggestions? Merci les gars!

+0

Je suppose que vous avez un 'home_controller' qui contient l'action 'home' qui dit quelque chose comme render: nothing => true? – jenjenut233

+0

Non. Il y a une action à la maison dans le contrôleur de la maison et il y a aussi une vue de la maison (home.html.erb). –

Répondre

69

Si votre projet est alimenté par des rails 3, il suffit d'ajouter cette ligne à votre routes.rb

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

Édition: Rails 4 support

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

Merci! Eh bien, c'est Rails 2.3.10 –

+0

Merci un * lot *, mec! Il l'a fait. C'est comme ça que je l'ai fait dans rails 2: 'map.connect '* chemin',: controller => 'home',: action => 'home'' Donc, c'est le'' chemin '' qui était la clé du la totalité. Merci encore :-) –

+0

Vous pouvez aussi utiliser 'get' au lieu de' match', qui est juste un raccourci pour ajouter 'via:: get'. – Peeja

1

Vous devez créer un contrôleur pour faire

class RedirectsController 

    def index 
    redirect_to root_url 
    end 
end 

Et dans vos itinéraires

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

Est-ce aussi la réponse pour Rails 3? –

+0

Fonctionne avec les rails 3 aussi. Vous avez juste besoin de changer la ligne avec match. Voir globalisation dans les guides de routage – shingara

19

Comme la réponse d'Arkan. Un point, si vous ne voulez pas ce comportement dans l'environnement de développement, pourrait alors faire -

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

Rails 4-

(routes.rb)

Vous pouvez toujours utiliser un simple get à rediriger toutes les routes inconnues.

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

Si vous souhaitez fournir le routage à la fois POST et GET demandes que vous pouvez toujours utiliser match mais Rails veut vous de spécifier la méthode de requête via via.

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

Rappelez-vous que routes.rb est exécuté de manière séquentielle (correspondant à la première route qui correspond à la structure de chemin fourni), alors mettez la capture wildcard au bas de votre appariements.

+1

Merci pour l'avis de mise au fond. – ahnbizcad

+0

Est-ce que cela fonctionne encore? Ne semble pas fonctionner dans mon application Rails 4. –