Utiliser un fichier statique public/404.html
dans Rails est très vite limitant. Si on veut utiliser le layout normal de l’application, des informations dynamiques comme des menus, le nom de l’utilisateur courant ou un formulaire de recherche il faut rendre ces erreurs dynamiques.
Pour ça il faut intercepter deux erreurs qui produisent des 404 : les infos nos trouvées dans la base via ActiveRecord::RecordNotFound
et les routes qui n’existent pas avec ActionController::RoutingError
.
Pour que les exceptions levées par ActiveRecord qui retournent une 404 soient gérées de façon dynamique il faut ajouter un gestionnaire d’exception :
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
rescue_from ActiveRecord::RecordNotFound, with: :error_404
private
def error_404
respond_to do |type|
type.html { render status: 404, template: "errors/404" }
type.all { render status: 404, nothing: true }
end
end
end
On peut maintenant ajouter tout ce qu'on veut dans views/errors/404.html.erb
. Sauvés !
Pas moyen de les intercepter au niveau du contrôleur ces erreurs là. Il faut donc créer une route générique à la main tout en bas du config/routes.rb
:
match "*path", to: "errors#not_found"
Et un contrôleur qui va gérer cette nouvelle route :
# app/controllers/errors_controller.rb
class ErrorsController < ApplicationController
def not_found
error_404
end
end
N'utilisez pas ça pour les erreurs 500, contentez-vous d'un public/500.html
ou votre application et Internet avec risquent d'imploser. Si vous voulez quelquechose de simili-dynamique vous pouvez utiliser un générateur de pages statiques comme snow.
est un développeur web vivant à Paris — Contact — Archives
Textes et contenus sous licence Creative Commons.