2012-02-21 8 views
8

Esta es una pregunta conceptual y no he podido encontrar la respuesta en SO, así que aquí voy:¿Por qué usar variables de instancia para "conectar" controladores con vistas?

¿Por qué variables de instancia se utilizan para conectar controladores y vistas? No tenemos dos objetos diferentes de dos clases diferentes (Controlador vs Vistas). Entonces, cuando se representa la vista, estamos en un contexto diferente, pero estamos usando variables de instancia de otro objeto. ¿No es esto la ruptura de la encapsulación de alguna manera?

¿Cómo se las arregla Rails para hacer esa coincidencia de un objeto a otro? ¿Clona todas las variables de instancias del controlador a la vista?

+1

@meggar, en realidad, usa las variables directamente. Vea 'BasicObject # instance_eval' en los documentos de Ruby y verá cómo puede ser esto. También mira 'Binding'. –

Respuesta

6

En cierto sentido, podría decirse que está rompiendo la encapsulación. Descubrí que si no tiene cuidado, es fácil combinar su lógica de negocios/presentación en Rails. Por lo general, comienza cuando estoy escribiendo una plantilla de vista y descubro que necesito algún valor que no pase desde el controlador. Así que vuelvo y ajuste el controlador para que se adapte a lo que necesito en la vista. Después de un ajuste, y otro, y otro, miras el método del controlador, y está configurando todo tipo de variables de instancia que no tienen sentido a menos que mires la vista para ver para qué sirven. Así que terminas en una situación en la que necesitas mirar tanto el controlador como la vista para comprender, en lugar de poder tomar uno u otro de forma aislada.

Creo que usar variables de instancia (junto con el truco Binding) es simplemente una forma de pasar cualquier valor que necesite del controlador para ver, sin tener que declarar parámetros por adelantado (como lo haría al definir un método). Sin declaraciones significa menos código para escribir, y menos para cambiar cuando desee refactorizar y reorganizar las cosas.

4

Rails usa eval y Binding para pasar variables de instancia del controlador a las vistas. Ver this presentation from Dave Thomas, hay un pequeño ejemplo en el minuto 46 'que explica cómo se hace esto.

+0

Si entendí correctamente, el OP se refería a '@ variables', mientras que el enlace es útil para enviar variables a parcial (en los locales). Cosas interesantes, sin embargo. – tokland

Cuestiones relacionadas