2012-06-18 4 views
5

Ich weiß, dass Sie haben können:Kann reject_if verwendet werden, um eine verschachtelte Ressource abzulehnen, wenn alle Felder außer einem leer sind?

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

Gibt es eine Möglichkeit, stattdessen etwas zu sagen wie

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

oder

accepts_nested_attributes_for :foo, :reject_if => all fields except record_date.blank? 

Dank

+0

Gleiche Frage. Das Auflisten aller leeren Felder in einem Proc ist nicht sehr DRY ... Ich habe ein verschachteltes Formular mit einem Auswahlfeld mit dem Standardwert (kann nicht leer sein). Ich möchte diesen Wert ignorieren, aber ich habe nichts sauberes gesehen ... –

Antwort

0

Angeregt durch diese: https://rails.lighthouseapp.com/projects/8994/tickets/2501-any_blank-and-all_blank-options-for-accepts_nested_attributes_for-reject_if

Dies funktionierte gut für mich:

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

Sie ['foo', 'bar', 'baz'].include?(k) durch k == 'foo' ersetzen kann, wenn es nur eine Ausnahme ist aber die erste Syntax macht das proc für mehrere diejenigen bereit.

+0

Versucht dies unter Rails 5, es funktioniert nicht. –

9

Ich bin ein bisschen auf diese spät, aber Sie tun können:

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

Dies sollte die akzeptierte Antwort sein - es ist sauber und effektiv. –

+1

danke! Noch eine späte Notiz: Vorsicht vor den Stringtasten bei Verwendung von 'except'. Sie können 'attributes.with_indifferent_access' verwenden, um diese Fälle zu umgehen. –