96 votes

Comment déclencher une exception dans Rails afin qu'elle se comporte comme les autres exceptions Rails?

Je voudrais soulever une exception pour qu'elle fasse la même chose qu'une exception Rails normale. En particulier, affichez l'exception et la trace de pile en mode développement et affichez la page "Nous sommes désolés, mais quelque chose s'est mal passé" en mode production.

J'ai essayé ce qui suit:

 raise "safety_care group missing!" if group.nil?
 

Mais il écrit simplement "ERROR signing up, group missing!" dans le fichier development.log

144voto

levinalex Points 2580

Vous n'avez pas à faire quelque chose de spécial, il faut juste être au travail.

Quand j'ai une nouvelle application rails avec cette commande:

class FooController < ApplicationController
  def index
    raise "error"
  end
end

et aller à l' http://127.0.0.1:3000/foo/

Je suis voyant l'exception avec une trace de la pile.

Vous ne pourriez pas voir l'ensemble de la stacktrace dans le journal de la console parce que les Rails (depuis 2.3) les filtres de lignes à partir de la trace de la pile qui proviennent de la structure elle-même.

Voir config/initializers/backtrace_silencers.rb dans les Rails de projet

63voto

halfdan Points 16440

Vous pouvez le faire comme ça:

 class UsersController < ApplicationController
  ## Exception Handling
  class NotActivated < StandardError
  end

  rescue_from NotActivated, :with => :not_activated

  def not_activated(exception)
    flash[:notice] = "This user is not activated."
    Event.new_event "Exception: #{exception.message}", current_user, request.remote_ip
    redirect_to "/"
  end

  def show
      // Do something that fails..
      raise NotActivated unless @user.is_activated?
  end
end
 

Ce que vous faites ici est de créer une classe "NotActivated" qui servira d'exception. En utilisant la levée, vous pouvez lancer "NotActivated" comme une exception. rescue_from est le moyen d'attraper une exception avec une méthode spécifiée (not_activated dans ce cas). Un exemple assez long, mais il devrait vous montrer comment cela fonctionne.

Meilleurs vœux,
Fabien

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X