2013-05-27 13 views
19
person = Person.find(4123) 
person.destroy #=> false 

Kaydın neden silinmediğini öğrenmek için hangi yolları kullanmalıyım? Modelin, her ikisi de yalnızca oluşturmada tetiklenen iki doğrulaması vardır. Bir geri dönüş var, ancak başarısız olursa geri arama engellenmez.Bir kaydı neden #destroy() yapamadığımı nasıl anlarım?

Bakmak için hiçbir iz veya hatam yok.

+0

Hangi Raylardasın? Lütfen Kişi modelinizi gönderin. – zeantsoi

cevap

20
Bu aynı sorunu içine koştu ve burada neler olduğunu anlamaya yaptığın şey

... tüm dernekler dependent: :destroy olarak ayarlanır ne:

ary = Klass.reflect_on_all_associations 
      .select { |a| a.options[:dependent] == :destroy } 
      .map(&:name) 

Sonra benim nesne üzerinde ary adlı derneklerin her aradı ve sonuçları toplanmıştır.

ary.select! { |a| obj.send(a).any? } 

Sonra bu dernek adlarıyla tarafından döndürülen nesnelerin her biri tahrip deneyebilirsiniz:

destroy_me = obj.send(ary[0]).first 
destroy_me.destroy 

Ben yalnızca bir nesne yüzden vardı Bu aslında bağımlı nesneleri sadece olanlara dernek isimleri sınırlar Yukarıdakiler, yıkımın başarısız olmasına neden olmak için yeterliydi. Sonra yok etmek için başarısız nesne üzerinde hatalara bakmak olabilir:

destroy_me.errors 

Ve sonunda başarısız imha neden oldu hata gördüğünü yer zaten. Oradan, sorunu çözmek için Basit Bir Programlama Maddesi (SMOP) vardı.

Durumumda, bağımlı nesne ilişkilendirmelerimden birinde çalışmayı imha etmeyi engelleyen bir before_destroy geri çağrısı vardı. Gelecekte hata ayıklamak için bu daha basit yapmak için başarısız bir geri aramada (errors.base hata mesajını eklemeye ek olarak) Rails günlüğüne bir hata kaydetmeye karar verdim.

+0

Teşekkürler, bana çok yardımcı oldu! Benim durumumda, nesneyi yok etmeyi önleyen 'before_destroy' yönteminde 'false' döndürdüm. – guyaloni

+1

İkinci kod bloğu tarafından biraz kafam karıştı. Şu anda olduğu gibi, nesnenin ilk ilişkilendirmeden herhangi birine sahip olmasına bağlı olarak, "ary" içindeki ilişkilerin tümünü veya hiçbirini seçmez. Bu ary.select olmalı! {| a | obj.send (a) yapacağı her türlü? } 'yerine – Aaron

2

Hangi sürüm Raylardasınız? Raylar 4'te, person.destroy!'u kullanarak bir yok etmeye zorlayabilirsiniz. Eylem başarısız olursa, bir geri bildirim görüntülenecektir.

+0

Bu doğru, yükseltme için gerçekten hazır değil, ActiveRecord :: RecordNotDestroyed istisnası –

+0

Rails 3.2 şimdi raylar. – krainboltgreene

+0

Sorun değil, lütfen sorunuzu "Person' modelinizi" içerecek şekilde genişletebilir misiniz? – zeantsoi

0

Bazı hata ayıklama bilgilerini eklemelisiniz örn. logger.debug ve günlük dosyalarınıza bakın. Örneğin. üretim modunda ve vb. çalıştırıyorsanız log/production.log ve nedenini bulabilmeniz gerekir. Değilse, ilgili günlük dosyası bölümünü (örneğin, yürüttüğünüz eylemi) buradan yükleyebilir ve size yardımcı olabiliriz.

Birincisi, yok etmeye çalışıyorum nesne sınıfı için, ben rakama bu koştum

+1

Bunu yakalamak için günlük deyimlerini nereye koyarsınız? – krainboltgreene

2

Bu hata genellikle, modeldeki bir ilişkilendirmede belirtilen dependent: :restrict_with_error nedeniyle ortaya çıkar. Bunun için model tanımınızda (ilgili model tanımlarının yanı sıra) hızlı arama yapın ve durumun bu olup olmadığını öğrenin.

İlgili konular