2009-10-31 5 views
7
class Gift < ActiveRecord::Base 
    has_many :contributions 
    accepts_nested_attributes_for :contributions, :reject_if => proc { |a| a['amount'].blank? } 

Contribución tiene un: atributo de apodo. En el: formulario nuevo, está rellenado previamente con el nombre real del usuario. Un usuario puede decidir cambiarlo a "Uncle Bob" (o lo que sea). Lamentablemente, con: reject_if, si no se especifica ninguna cantidad en la contribución, el cambio de apodo se pierde cuando: nuevas recargas en casos donde @gift no es válido. Esto sucede porque los atributos contributivos anidados son rechazados. ¿Cómo preservamos el cambio de apodo y solo manejamos el rechazo cuando @gift se guarda realmente?accepts_nested_attributes_for &: reject_if. ¿Cómo prevenir el rechazo hasta que se guarde la asociación de padres?

Respuesta

9
class Gift < ActiveRecord::Base 
    has_many :contributions 
    accepts_nested_attributes_for :contributions, 
    :reject_if => proc { |a| a['amount'].blank? } 
end 

class Contribution < ActiveRecord::Base 
    belongs_to :gift 
    validates_presence_of :nickname, :amount 
end 

... en forma de regalo ...

f.text_field :nickname, :value => (params[:gift][:contributions_attributes]['0'][:nickname] rescue @m.full_name) 

Esto preserva: apodo cambia a través de validaciones fallidas y todavía descarta una contribución anidados que contienen: apodo solamente.

0

Creo que está buscando una validación en el modelo de contribución en lugar de una cláusula: reject_if.

: reject_if descartará todo el registro si se cumple la condición. Las validaciones fallidas en el modelo de contribución impedirán que se guarde el regalo asociado. Sin embargo, @gift retendrá la contribución independientemente de su valor de cantidad en un ahorro fallido, lo que le permite a su usuario corregirlo, cuando el controlador vuelva a presentar la nueva acción.

La solución es eliminar la cláusula: reject_if de la sentencia accept_nested_attributes_for y agregar validates_presence_of_amount en el modelo de Contributions.

class Gift < ActiveRecord::Base 
    has_many :contributions 
    accepts_nested_attributes_for :contributions 
    ... 
end 

class Contribution < ActiveRecord::Base 
    validates_presence_of :amount 
    ... 
end 
+0

Sí, tengo validates_presence_of: amount en Contribution. Cuando el formulario @gift se envía con: 1) campos Contribution en blanco, funciona. (El regalo descarta el nido vacío) 2) con: cantidad, funciona. (La validación se realiza). 3) con un: apodo pero no: cantidad, no funciona. Este es el caso predeterminado, porque queremos que el formulario sea rellenado previamente con el nombre completo del usuario en: apodo. Agregar el: reject_if => a ['amount']. Blank ?, elimina cualquier cambio que el usuario haga al apodo. Queremos que esos cambios se conserven. ¿Tener sentido? – Gavin

+0

Si ese es el caso, ¿debería modificar la cláusula: reject_if en {| a | ['amount']. Blank? && a ['apodo'], en blanco?} – EmFi

Cuestiones relacionadas