2012-06-18 14 views
5

bende sende biliyorum: Biri dışındaki tüm alanlar boşsa, iç içe geçmiş bir kaynağı reddetmek için reject_if kullanılabilir mi?

accepts_nested_attributes_for :foo, :reject_if => proc { |a| a[:bar].blank? } 

yerine

accepts_nested_attributes_for :foo, :reject_if => blah[:bar].blank? and flah[:bar].blank? 

veya

gibi bir şey
accepts_nested_attributes_for :foo, :reject_if => all fields except record_date.blank? 

Teşekkür

+0

aynı soruyu. Bir proc içindeki tüm boş alanları listelemek çok DRY değil ... Varsayılan değeri olan bir seçim kutusuyla (boş bırakılamaz) iç içe geçmiş bir formum var. Bu değeri görmezden gelmek istiyorum ama temiz bir şey görmedim ... –

cevap

0

bu ilham demek için bir yol var mı: https://rails.lighthouseapp.com/projects/8994/tickets/2501-any_blank-and-all_blank-options-for-accepts_nested_attributes_for-reject_if

Bubenim için iyi çalıştı: orada sadece bir istisna var ama ilk sözdizimi birden olanlar için proc hazır yaparsa k == 'foo' tarafından ['foo', 'bar', 'baz'].include?(k) yerini alabilir

reject_if: proc { |attributes| attributes.all? {|k,v| v.blank? || ['foo', 'bar', 'baz'].include?(k)} } 

.

+0

Bunu Rails 5 altında denedim, işe yaramıyor. –

9

Bu konuda biraz geciktim, fakat yapabileceğin:

accepts_nested_attributes_for :foo, 
           reject_if: ->(attributes){ 
           attributes.except(:key).values.all?(&:blank?) 
           } 
+0

Bu kabul edilen cevap olmalı - temiz ve etkili. –

+1

teşekkürler! Bir başka geç not: 'except' kullanırken dize tuşlarına dikkat edin. Bu gibi durumlarda çalışmak için 'attributes.with_indifferent_access' kullanabilirsiniz. –

İlgili konular