Sunfox


Erreurs 404 dynamiques dans Rails 3

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.

RecordNotFound

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 !

RoutingError

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

Erreurs 500 ?

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.

👨🏻‍🦰 Sunny Ripert

est un développeur web vivant à ParisContactArchives

Textes et contenus sous licence Creative Commons.