Pregunta ¿Cómo presento una excepción en Rails para que se comporte como las otras excepciones de Rails?


Me gustaría plantear una excepción para que haga lo mismo que una excepción normal de Rails. Especialmente, muestre la excepción y la pila en el modo de desarrollo y muestre la página "Lo sentimos, pero algo salió mal" en el modo de producción.

Intenté lo siguiente:

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

Pero simplemente escribe "ERROR signing up, group missing!" al archivo development.log


75
2017-12-16 22:49


origen


Respuestas:


No tienes que hacer nada especial, simplemente debería estar funcionando.

Cuando tengo una nueva aplicación de rieles con este controlador:

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

E ir a http://127.0.0.1:3000/foo/

yo soy viendo la excepción con un rastro de pila.

Es posible que no vea toda la pila en el registro de la consola porque Rails (desde 2.3) filtra las líneas del seguimiento de la pila que provienen del propio marco.

Ver config/initializers/backtrace_silencers.rb en tu proyecto Rails


116
2017-12-17 00:11



Puedes hacerlo así:

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

Lo que estás haciendo aquí es crear una clase "NotActivated" que servirá como Exception. Usando raise, puedes lanzar "NotActivated" como una excepción. rescue_from es la forma de atrapar una excepción con un método específico (no activado en este caso). Un buen ejemplo, pero debería mostrarte cómo funciona.

Los mejores deseos,
fabianista


54
2017-12-16 22:56



Si necesita una forma más sencilla de hacerlo, y no quiere mucho alboroto, una simple ejecución podría ser:

raise Exception.new('something bad happened!')

Esto generará una excepción, por ejemplo e con e.message = something bad happened!

y luego puedes rescatarlo ya que estás rescatando todas las demás excepciones en general.


8
2017-11-18 12:41