2011-03-31 14 views
12

que tengo una clase de información de contacto definida así:rieles/mensajes de error MongoId en atributos anidados

class ContactInfo 
    include Mongoid::Document 

    validates_presence_of :name, :message => ' cannot be blank' 

    field :name, :type => String 
    field :address, :type => String 
    field :city, :type => String 
    field :state, :type => String 
    field :zip, :type => String 
    field :country, :type => String 
    embedded_in :user 
end 

Esta clase de información de contacto se embedd como un atributo anidado dentro de mi clase de usuario:

class PortalUser 
    include Mongoid::Document 
    accepts_nested_attributes_for :contact_info 
end 

Cuando intento guardar un usuario sin un nombre, recibo un mensaje de error como este:

La información de contacto no es válida

Sin embargo, esto no es muy útil para el usuario final, porque él o ella no sabe qué información de contacto no es válida. El mensaje REAL debería ser 'El nombre no puede estar en blanco'. Sin embargo, este error no se propaga hacia arriba. ¿Hay alguna forma de obtener el mensaje "El nombre no puede estar en blanco" dentro de user.errors en lugar de que el mensaje de error "Información de contacto no sea válido"?

Gracias

+0

Mongo tiene esta incorporada, con validates_associated. Consulte http://stackoverflow.com/questions/5078661/field-for-and-nested-form-with-mongoid –

+1

validates_associated solo valida los modelos asociados pero todavía escupe el mensaje de error inútil. – UrLicht

Respuesta

11

Aquí está la solución que finalmente ocurrió:

Añadido estas líneas a la clase de usuario

after_validation :handle_post_validation 
def handle_post_validation 
    if not self.errors[:contact_info].nil? 
    self.contact_info.errors.each{ |attr,msg| self.errors.add(attr, msg)} 
    self.errors.delete(:contact_info) 
    end 
end 
+0

Mongo tiene esto incorporado, con 'validates_associated'. Consulte http://stackoverflow.com/questions/5078661/field-for-and-nested-form-with-mongoid –

+0

Tenga en cuenta que este código agregará los atributos anidados al final de la matriz de errores. – Nobu

-2

Puede haber una solución en el controlador ...

en la acción crear, puede agregar algo como

params[:portal_user][:contact_info_attributes] = {} if params[:portal_user] && params[:portal_user][:contact_info_attributes].nil?

Esto obligará contact_info creación, y dará lugar a un error en el campo derecho

Si no se agrega esto, contact_info no se crea

1

En lugar de devolver los user.errors.full_messages crean un método de mensaje de error específico para su modelo de usuario donde maneja todos sus errores de documentos incrustados.

class PortalUser 
    include Mongoid::Document 
    accepts_nested_attributes_for :contact_info 
    def associated_errors 
    contact_info.errors.full_messages unless contact_infos.errors.empty? 
    end 
end 

y en su controlador

flash[:error] = user.associated_errors 
Cuestiones relacionadas