2016-06-14 8 views

Odpowiedz

17

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. "

Source

+4

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

+0

Dzięki, zaktualizowałem swoją odpowiedź, aby pomóc nowym osobom. – Leito

+1

Dzięki za określenie: przerwij technikę dla Rails 5. Naprawdę pomóż mi. – CanadaIT

2

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 

Documentation

+0

thnks, ale nie chcę niczego podnieść ... po prostu nie rób nic. –

+0

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. –

+1

W Rails 5 będziesz musiał jawnie "raise: abort". Równie dobrze możesz zacząć już teraz. – mwoods79

1

Można również zastąpić metodę #destroy:

def destroy 
    study_assignments.empty? ? super : self 
end