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.