Ho un modello che utilizza una forcella acts_as_nested_set
e ho aggiunto un metodo al modello per salvare il modello e spostare il nodo nell'insieme in una transazione. Questo metodo chiama un metodo di convalida per assicurarsi che lo spostamento sia valido, che restituisce vero o falso. Se la convalida fallisce, voglio che il mio metodo di salvataggio aumenti ActiveRecord::Rollback
per il rollback della transazione, ma restituisca anche false al chiamante.Come aumentare un'eccezione di ActiveRecord :: Rollback e restituire un valore insieme?
Il mio modello è simile al seguente:
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
Tuttavia, quando chiamo salvo in una situazione che verrebbe a mancare, la transazione viene annullata, ma la funzione restituisce 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, essenzialmente la stessa conclusione a cui sono arrivato. –
GRAZIE! Ancora valido in Rails 3.2.8. Non mi è stato chiaro dalla [documentazione] (http://api.rubyonrails.org/classes/ActiveRecord/Rollback.html) che "raise ActiveRecord :: Rollback" salta alla linea dopo la fine della transazione. Sembrava che stesse cadendo, come se il Rollback non interrompesse affatto il flusso del programma. –