validar rails formularios campos asociaciones anidados ruby-on-rails validation ruby-on-rails-4 nested-attributes

ruby on rails - rails - ¿Cómo puedo validar el campo de atributos anidados en rieles 4?



rails asociaciones (3)

Tengo dos modelos

class Information < ActiveRecord::Base belongs_to :study validates_presence_of :email end

y

class Study < ActiveRecord::Base has_many :informations accepts_nested_attributes_for :informations end

Aparece una forma de estudio que contiene pocos campos para las informaciones y quiero validar la presencia de esos campos. Solo en el caso de la validación, también quería guardar los valores del campo de estudio y quería mostrar los errores si la validación falla. ¿Cómo puedo hacer esto? Gracias por adelantado.


Usted escribe validaciones en los modelos que necesita, como es normal. Entonces, si necesita validar la presencia de foo de campo en la clase de Information , simplemente escribiría validates_presence_of :foo en esa clase. Del mismo modo, las validaciones para los campos de Study solo van en la clase de Study . Con los atributos anidados, cuando actualiza una instancia de Study desde un hash de params que contiene atributos anidados, actualizará las instancias de Information también, ejecutando validaciones al pasar. Eso es lo que hace la llamada accepts_nested_attributes_for está dando "permiso" para que los bits apropiados de hash de params se usen de esta manera.

Puede usar reject_if para rechazar solo nuevos registros anidados si no cumplen los criterios. Así que podría dejar que alguien cree un Estudio y solo crear una o más instancias de Información anidadas asociadas con ese Estudio si hubieran rellenado los campos en el formulario, pero si los dejaran en blanco, no se crearían las cosas anidadas y guardado (para que no obtenga registros asociados en blanco sin sentido). El Estudio aún se guardará. Por ejemplo:

accepts_nested_attributes_for( :informations, reject_if: proc() { | attrs | attrs[ ''title'' ] .blank? } )

Esto y más están cubiertos en la documentación de API aquí:

Tenga en cuenta que los campos anidados son solo para registros existentes . Si estuviera creando una nueva instancia de estudio en una acción new / create sin instancias de información asociadas, no verá ningún campo de formulario anidado para su clase de información, cuando podría estar esperando solo una, para un elemento nuevo en blanco. ¡Esto puede ser muy confuso si no estás preparado para eso! Necesitará agregar manualmente una nueva instancia de Information a su instancia de Study en el controlador o similar para las acciones ''nueva'' y ''crear'', por ejemplo, utilizando before_filter :create_blank_object, only: [ :new, :create ] , with, say :

def create_blank_object @study = Study.new @study.informations << Information.new end


puede usar la validación validates_presence disponible en rieles, de otro modo puede escribir before_create o before_save callback method. escriba la validation logic dentro del método de devolución de llamada before_create o before_save .


Consulte el API Doc para validates_associated :

Valida si el objeto u objetos asociados son todos válidos. Funciona con cualquier tipo de asociación.

Si llama a un método en el objeto principal que ejecuta validaciones (por ejemplo, guardar), también se llamará a la validación de los objetos asociados.