2011-12-09 16 views
8

Me gustaría saber cuál es la forma "correcta" de inicializar los campos anidados de un modelo.Forma correcta de inicializar campos anidados en formularios Rails

Digamos que usted tiene algunos campos anidados para un modelo:

class User 

    has_one :address 
    accepts_nested_attributes_for :address 
end 

y que necesita para inicializar los atributos (address en este caso) para utilizarlos en una llamada fields_for.

Hasta ahora he pensado en tres formas de hacerlo.

En primer lugar, after_initialize gancho en el modelo:

class User 
    after_initialize :init_address 

    protected 
    def init_address 
    address ||= build_address 
end 

entonces tenemos la inicialización en el controlador:

class UsersController 
    def new  
    @user = User.new 
    @user.build_address 
    end 
end 

Y, por último, podemos tener un método de ayuda a hacerlo por nosotros:

module FormHelpers 
    def setup_user(user) 
    user.address ||= user.build_address 
    user 
    end 
end 

# view 

<%= form_for setup_user(@user)... %> 

¿Hay algo que se parezca a un estándar o una "mejor es el escenario? ¿Cómo lo haces y por qué?

+0

En la falta de una solución mejor, terminé escribiendo una joya que se encarga de esto: https://github.com/febuiles/auto_build –

+0

Parece una publicación anterior. ¿Qué versión de Rails estás usando? –

Respuesta

0

Creo que build_address ya está incorporado en los rieles después de declarar una asociación has_one, por lo que no necesita escribir ese bit urself. y si el formulario se llama solo desde la acción nueva, lo que realmente necesita es solo el bit del controlador, y nada más

+0

Hubo un error tipográfico en el código, en lugar de 'build_address' el método se debe llamar' init_address'. Espero que esté más claro ahora. –

+0

Pensé que era '@ user.addresses.build'? –

+0

@macek: para un elemento (tiene una relación), utiliza build_field. Para varios elementos (has_many) usas fields.build. –

2

Creo que si el atributo anidado no tiene ningún sentido sin el modelo principal, construir y la inicialización de estos modelos anidados debe ser responsabilidad del modelo padre.

No veo por qué el UsersController debería preocuparse de cómo se construyen 0 inicializan @user.addresses. Para mí, darle al controlador esta responsabilidad, probablemente implicaría que en create debería ser el que analizó y construyó los atributos anidados (lo cual ocurre en el modelo).

Me gustaría ir por el primer acercamiento.

+0

El primer enfoque falla en el caso de formularios anidados. El objeto anidado se reinicializa y la forma anidada puede fallar las validaciones. – Bot

Cuestiones relacionadas