web-dev-qa-db-fra.com

Rails: redirige tous les itinéraires inconnus vers root_url

Chaque fois qu'un utilisateur frappe la mauvaise page, Rails affiche 404.html à partir du dossier public. Cependant, je voudrais simplement rediriger le navigateur vers la page racine, sans rien afficher. J'ai donc essayé globbing, mais en vain, il affiche toujours la page 404. Voici un extrait de mon fichier routes:

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

Aucune suggestion? Merci les gars!

39
Albus Dumbledore

Si votre projet est propulsé par Rails 3, ajoutez simplement cette ligne à vos routes.rb

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

Modifier: si vous êtes sur Rails 4 ou 5

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

ou

get '*path' => redirect('/')
76
Arkan

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

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

Rails 4-

(routes.rb)

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

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

Si vous souhaitez fournir un routage aux deux POST et GET requêtes, vous pouvez toujours utiliser match, mais Rails veut que vous spécifiez la méthode de demande via via.

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

N'oubliez pas que routes.rb est exécuté de manière séquentielle (correspondant à la première route qui correspond à la structure de chemin fournie), donc placez la capture de caractères génériques au bas de vos correspondances.

11
user

Il semble y avoir un bogue dans Rails 5.2 où les routes active_storage sont récupérées par la route catchall, entraînant des liens rompus vers les images téléchargées. Le problème a été signalé dans le Rails repo sur github, et quelqu'un a commenté avec le patch ci-dessous jusqu'à ce que le bug soit corrigé dans une nouvelle version:

Dans routes.rb juste avant le dernier end

get '*all', to: 'application#index', constraints: lambda { |req|
    req.path.exclude? 'Rails/active_storage'
  }

puis dans le contrôleur d'application ajoutez:

def index
  flash.notice = 'No page found at that address'
  redirect_to root_path
end
3
tomb

Vous devez créer un contrôleur pour ce faire

class RedirectsController 

  def index
    redirect_to root_url
  end
end

Et dans vos itinéraires

map.connect '*', :controller => 'redirects', :action => 'index'
1
shingara