Sunfox

Le journal de Sunny Ripert


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.

Articles probablement reliés

Commenter


Vous pouvez avoir une jolie icône vous aussi en créant un gravatar.

Vous pouvez y saupoudrer de l'HTML5 avec les balises et suivantes : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>.


:D Sunny Ripert

est un développeur web vivant à Paris.

CV, me contacter


Textes et contenus sous licence Creative Commons.
Site crée par mes soins et propulsé par WordPress.