Tengo un modelo que usa una horquilla acts_as_nested_set
, y he agregado un método al modelo para guardar el modelo y mover el nodo al conjunto en una transacción. Este método llama a un método de validación para asegurarse de que el movimiento sea válido, lo que devuelve verdadero o falso. Si la validación falla, quiero que mi método de guardado eleve ActiveRecord::Rollback
para deshacer la transacción, pero también devuelva falso a la persona que llama.¿Cómo generar una excepción ActiveRecord :: Rollback y devolver un valor?
Mi modelo es el siguiente:
class Category < ActiveRecord::Base
acts_as_nested_set :dependent => :destroy, :scope => :journal
def save_with_place_in_set(parent_id)
Category.transaction do
return false if !save_without_place_in_set
if !validate_move parent_id
raise ActiveRecord::Rollback and return false
else
place_in_nested_set parent_id
return true
end
end
end
alias_method_chain :save, :place_in_set
def validate_move(parent_id)
# return true or false if the move is valid
# ...
end
def place_in_nested_set(parent_id)
# place the node in the correct place in the set
# ...
end
end
Sin embargo, cuando llamo, salvo en una situación que sería un fracaso, la transacción se deshace, pero la función devuelve nil
:
>> c = Category.new(:name => "test")
=> #<Category id: nil, name: "test" parent_id: nil, lft: nil, rgt: nil>
>> c.save_with_place_in_set 47
=> nil
>> c.errors.full_messages
=> ["The specified parent is invalid"]
+1, esencialmente la misma conclusión a la que llegué. –
¡GRACIAS! Aún válido en Rails 3.2.8. No estaba claro para mí de la [documentación] (http://api.rubyonrails.org/classes/ActiveRecord/Rollback.html) que 'elevar ActiveRecord :: Rollback' salta a la línea después del final de la transacción. Parecía que estaba cayendo, como si el Rollback no interrumpiera el flujo del programa. –