with rescue_from rails lanzar exceptions ruby-on-rails exception activerecord

ruby on rails - rescue_from - ActiveRecord#existe? o rescate de ActiveRecord:: RecordNotFound



ruby raise exception with message (4)

¿Por qué no haces algo como ...

@cart = @user.cart || @user.cart.new

No hay que preocuparse por las excepciones o si / else declaraciones. Entonces, en tu opinión, podrías tener algo como ...

<% if @cart.empty? # or whatever method you use to determine # if there is nothing in the cart...maybe .blank? is fine? %> <p>Your cart is empty</p> <% else %> <!-- loop through objects in your cart --> <% end %>

¿Cuál es la forma recomendada de manejar el siguiente tipo de situaciones:

Suponiendo que tengo un modelo llamado Cart , que tiene una relación de 1-1 con la Person modelo y la misma PK (la identificación del usuario).

En el método de index de mi cart_controller quiero verificar si existe un Cart para el usuario actual. Si hago Cart.find(the_user_id) y no existe un carrito, se RecordNotFound una excepción RecordNotFound .
Veo dos maneras de resolver esto:

1. rescate de la excepción

begin @cart = Cart.find(the_user_id) #more code here rescue ActiveRecord::RecordNotFound #the cart is empty message end

2. usar ActiveRecord # existe? método

if Cart.exists?(the_user_id) @cart = Cart.find(the_user_id) #more code here else #the cart is empty message end

Por mi (limitado) conocimiento sobre el manejo de excepciones, sé que no se recomienda usar excepciones de esta manera, pero ¿vale la pena hacer una consulta adicional cada vez?


Podrías intentar pedirle al objeto de usuario su carrito. Supongamos que tiene el usuario asignado a @user y, si el usuario tiene un carrito, sería @user.cart . Si @user.cart es nil entonces no tienen uno.

Esto supone que tiene las relaciones entre los modelos configurados correctamente.


Use find_by_id en lugar de find:

@cart = Cart.find_by_id(params[:id])

nil es si no existe, así que puedes marcar "if @cart" en tu controlador / vista según sea necesario


existe? daría como resultado una declaración SQL más, a menos que los chicos de ActiveRecord lo optimicen (no contaría con eso).

Por lo tanto, le aconsejo que use una excepción, es mucho más barato que una declaración SQL.