jest jakiś sposób, pod pewnymi warunkami, anulować zniszczenie obiektu na callback before_destroy aktywnego rekordu? DziękiRails - Anuluj niszcz na before_destroy callback
Odpowiedz
Powinieneś zwrócić false
.
Szyny 5
"Anulowanie callbacks
Jeśli before_ * zwrotna rzutów. Abort, wszystkie późniejsze wywołania zwrotne i związane z nimi działania są anulowane"
Szyny 4 i niższe
„Anulowanie callbacks
Jeśli before_ * zwrotna zwraca false, wszystkie późniejsze wywołania zwrotne i związane z nimi działania są anulowane. Oddzwaniania są zwykle prowadzone w kolejności, w jakiej zostały zdefiniowane, z z wyjątkiem wywołań zwrotnych zdefiniowanych jako metody na modelu, które są nazywane jako ostatnie. "
Szyny owija ratuje i niszczy w transakcji, a więc raise
w zwrotnego będzie działać:
class Post < ActiveRecord::Base
before_destroy :saveable?
def saveable?
if true
raise "Destroy aborted; you can't do that!"
end
end
end
zastępczy true
o swoim stanie.
Oto wyjście konsola skrócona:
[1] pry(main)> Post.first.id
=> 1
[2] pry(main)> Post.first.destroy
RuntimeError: Destroy aborted; you can't do that!
[3] pry(main)> Post.first.id
=> 1
thnks, ale nie chcę niczego podnieść ... po prostu nie rób nic. –
To ma sens. Ponieważ jest to callback 'before_ *', działa 'raise' lub' false'. Zaletą "podbicia" jest to, że otrzymasz wyraźną wiadomość, którą możesz prześledzić w dziennikach, a nie "zniszczyć" po cichu nie. Wybór zależy od nieoczekiwanego przypadku niepowodzenia. –
W Rails 5 będziesz musiał jawnie "raise: abort". Równie dobrze możesz zacząć już teraz. – mwoods79
Wracając false
jest sposobem, aby to zrobić prawidłowo:
before_destroy do
if self.some_condition?
return false
end
end
można znaleźć w dokumentacji tutaj w punkcie 6 Halting Execution
. http://guides.rubyonrails.org/active_record_callbacks.html
Można również zastąpić metodę #destroy
:
def destroy
study_assignments.empty? ? super : self
end
- 1. Anuluj Rails Połączenie DB
- 2. Anuluj Anuluj przycisk Anuluj Nie pokazano na Androidzie
- 3. Vagrant: niszcz nie działa
- 4. zależna => niszcz na skojarzeniu "has_many through"
- 5. Rails: jak wyłączyć before_destroy oddzwanianie, gdy jest niszczone z powodu dominującej jest niszczona (: dependent =>: zniszczyć)
- 6. Anuluj subskrypcję na koniec okresu
- 7. dojo: niszcz wszystkie widżety według węzła dom.
- 8. Wycofanie UWAGA w Rails3 dla before_create, before_update, before_save, before_destroy
- 9. Animacja CSS3 "postęp" callback
- 10. UITableView beginUpdates/endUpdates callback
- 11. Zatrzymaj/Anuluj Przesyłanie na AWS S3
- 12. iOS UIScrollView anuluj dotyk Uibutton na przewijanie
- 13. Przycisk Anuluj miejsce w UIActionSheet na dole
- 14. Anuluj pęcherzyków na tag HTML kotwicy
- 15. Obraz na przycisk Anuluj od UISearchbar
- 16. Anuluj toast na Androida, zanim pojawi się
- 17. Anuluj limit czasu AngularJS $ na routingu Zmień
- 18. Anuluj zadanie i poczekaj na jego zakończenie.
- 19. callback - ścisłe naruszenie
- 20. RecyclerView onItemClicked callback
- 21. Jquery - fancybox i callback
- 22. callback jquery clickback kliknięty
- 23. O callback app.listen()
- 24. jQuery.getJSON (url [dane], [callback])
- 25. Anuluj całą tablicę
- 26. SDWebImage Anuluj pobieranie
- 27. ios segue "anuluj"
- 28. Swift prepareForSegue anuluj
- 29. Anuluj Zdarzenie przyciśnięcia klawisza
- 30. Programowo anuluj subskrypcję zdarzenia
z szynami 5, wracając fałszywe już nie działa. Należy "rzucać (: przerwać)", aby zapobiec usunięciu rekordu. Zobacz [ten komentarz] (http://stackoverflow.com/questions/123078/how-do-i-validate-on-destroy-in-rails#comment59333149_123190) – RFVoltolini
Dzięki, zaktualizowałem swoją odpowiedź, aby pomóc nowym osobom. – Leito
Dzięki za określenie: przerwij technikę dla Rails 5. Naprawdę pomóż mi. – CanadaIT