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!
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('/')
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?
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.
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
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'