Una domanda su accepts_nested_attributes

Spesso vedo negli esempi:

accepts_nested_attributes_for :tags, :allow_destroy => :true,
:reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } }

dove la :reject_if evita che il modello venga salvato se tutti i suoi
attributi sono vuoti.
Ma se nel modello uso i validates obbligando a riempire almeno un
campo non ottengo lo stesso risultato?
Se si posso quindi evitare di usare la :reject_if.

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 11/11/2011 09:51, Mauro wrote:

accepts_nested_attributes_for :tags, :allow_destroy => :true, :reject_if =>
proc { |attrs| attrs.all? { |k, v| v.blank? } }

dove la :reject_if evita che il modello venga salvato se tutti i suoi
attributi sono vuoti. Ma se nel modello uso i validates obbligando a
riempire almeno un campo non ottengo lo stesso risultato? Se si posso
quindi evitare di usare la :reject_if.

Credo di si perch come ci si aspetta le validazioni dei modelli sono
onorate anche delegando la creazione dell’albero di oggetti ad
accepts_nested_attributes_for

Se togli il reject_if e lasci solo la validazione sui campi di Tag
dovrebbe
ad occhio
succedere questo:

    • parti da un form in cui ci sono i campi degli has_many (che il
      motivo per
      cui usi accepts_nested_attributes_for)
    • SE invii i campi di un tuo oggetto Tag tutti vuoti
    • ALLORA la validazione ti impedir di salvare tutto l’albero degli
      oggetti
      che stai creando perch ci sono errori e accepts_nested_attributes_for fa
      tutto con un’unica transazione

reject_if serve a togliere roba evidentemente inutile, forse accoppia
troppo
il modello con la vista ma utile se usato in questo senso e toglie
logica
per la creazione di modelli dai controller rimettendola nei modelli (non
sempre quello che si vuole)

Comunque accepts_nested_attributes_for mi sembra una funzionalit che
almeno
per un periodo iniziale stata famigerata perch copre alcuni casi d’uso
e
non altri che ci si aspetta e rischia di esporre dei problemi di
sicurezza se
non usata con cognizione di causa (questo ultimo paragrafo solo
un’impressione che non saprei circostanziare bene)

Buona esplorazione :wink:

Antonio B.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iQEcBAEBAgAGBQJOvYSxAAoJELgLplTPZUF9HpAH/14eLCbUsjq19cSgrEG/OPB6
JmpBkvtvB4VEM+roVfsC36PBgeh8mjrVzqFo/3D0rPRB9UBfdg9cpIQa4/OVK4UE
Dw01KLnOX5ffZGhqmXfk4t9PjJ8rAWN1+xUbSeVUwu9jA3n2LO9QIoIT+dpi+HID
MXPNAhJk+k3SF9b928TBMedQQ9Hmpqee7QM0meKKQ/pdiE3J0Xv/JXGflOGbElyh
Es1v1F7hFoqOW+San6WYgFvK06k0AQwK/8ooglJBwweKK1SzxR0Dcygf/y+zamqd
woBpzqvDDqPjznGH0GppzUDl8C3cUSPzD7F9d53MIZiHMKaK79vriX0XEv3uqZQ=
=ZZMN
-----END PGP SIGNATURE-----