Mam model, który używa widelca acts_as_nested_set
i dodałem metodę do modelu, aby zapisać model i przenieść węzeł do zestawu w jednej transakcji. Ta metoda wywołuje metodę sprawdzania poprawności, aby upewnić się, że ruch jest poprawny, co zwraca wartość true lub false. Jeśli sprawdzanie poprawności nie powiedzie się, chcę, aby moja metoda składowania podniosła ActiveRecord::Rollback
w celu wycofania transakcji, ale także zwróciła false do osoby dzwoniącej.Jak podnieść wyjątek ActiveRecord :: Rollback i zwrócić wartość razem?
Mój model wygląda następująco:
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
Jednak kiedy zadzwonić Zapisz w sytuacji, która nie powiedzie, transakcja zostanie wycofana, ale zwraca 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, w zasadzie ten sam wniosek, do którego doszedłem. –
DZIĘKUJEMY! Nadal ważne w Railsach 3.2.8. Nie było dla mnie jasne z [dokumentacji] (http://api.rubyonrails.org/classes/ActiveRecord/Rollback.html), które "podnoszą ActiveRecord :: Rollback" przeskakuje do linii po zakończeniu transakcji. Wyglądało na to, że właśnie się przewracało, jakby Rollback w rzeczywistości nie przerywał przepływu programu. –