Pregunta

El nifty_scaffolding de Ryan Bates, por ejemplo, hace esto

editar.html.erb

<%= render :partial => 'form' %>

nuevo.html.erb

<%= render :partial => 'form' %>

_formulario.html.erb

<%= form_for @some_object_defined_in_action %>

Ese estado oculto me hace sentir incómodo, por eso normalmente me gusta hacer esto.

editar.html.erb

<%= render :partial => 'form', :locals => { :object => @my_object } %>

_formulario.html.erb

<%= form_for object %>

Entonces cual es mejor: a) tener acceso parcial a variables de instancia o b) pasar un parcial todas las variables que necesita?

He estado optando por b) últimamente, pero me encontré con un pequeño problema:

alguna_acción.html.erb

<% @dad.sons.each do |a_son| %>
<%= render :partial => 'partial', :locals => { :son => a_son } %>
<% end %>

_partial.html.erb

The son's name is <%= son.name %>
The dad's name is <%= son.dad.name %>

¡son.dad hace una llamada a la base de datos para buscar al papá!Entonces tendría que acceder a @dad, que sería volver a a) tener acceso parcial a variables de instancia O tendría que pasar @Dad en los locales, cambiando el render: parcial a < %= render: parcial => 'parcial' ,: locals => {: dad => @Dad ,: son => a_son} %>, y Por alguna razón, pasar un montón de vars a mi parcial me hace sentir incómodo.Quizás otros también se sientan así.

Ojalá eso tuviera algún sentido.Buscando una idea de todo este asunto...¡Gracias!

¿Fue útil?

Solución

En versiones recientes de Rails es bastante más fácil renderizar parciales y pasarles locales.En lugar de esto.

<%= render :partial => 'form', :locals => { :item => @item } %>

Puedes hacerlo.

<%= render 'form', :item => @item %>

No hago esto en el generador Nifty Scaffold para mantener la compatibilidad con versiones anteriores, pero lo cambiaré en una versión futura.

En cuanto a si es aceptable usar variables de instancia en parciales.Creo que es.En términos prácticos, ¿cuál es la desventaja?Ciertamente las cosas pueden salirse de control si no eres constante, pero a mí me gusta aplicar estas pautas.

  1. Nunca cree una variable de instancia solo para compartirla entre parciales.Por lo general, esto significa que solo compartirá el objeto de recurso del controlador.

  2. Si el parcial tiene el mismo nombre que el recurso, páselo como local con <%= render @item %>.

  3. Si el parcial se compartirá entre varios controladores, utilice solo los locales.

Esto es lo que me funciona bien de todos modos.

Consejo adicional: Si se encuentra pasando muchos locales a un parcial y desea que algunos de ellos sean opcionales, cree un método auxiliar que represente el parcial.Luego, utilice siempre el método auxiliar para poder crear una interfaz limpia con argumentos opcionales para representar el parcial.

Otros consejos

Usar @instance_variables en parciales es un mal diseño.

El uso de variables de instancia en parciales funciona, pero puede dificultar el mantenimiento de las aplicaciones si alguna vez se necesitan cambios.

La desventaja de usar variables de instancia en parciales es que crea una dependencia en el parcial con algo fuera del alcance del parcial (acoplamiento).Esto hace que el parcial sea más difícil de reutilizar y puede forzar cambios en varias partes de la aplicación cuando desea realizar un cambio en una parte.

Parciales que usan variables de instancia:

  • debe cambiar cuando la variable de instancia en cualquier controlador que utilice el cambio parcial ya sea el nombre de la variable de instancia o su tipo o estructura de datos
  • hacer que todas las acciones del controlador que usan el parcial cambien de la misma manera al mismo tiempo cuando hay cambios en la forma en que se usa la variable de instancia
  • Desalentar la reutilización, ya que solo se pueden reutilizar fácilmente en acciones que configuran variables de instancia con el mismo nombre y datos.

En lugar de eso, pasa los locales a los parciales:

<%= render 'reusable_partial', :item => @item %>

Ahora bien, debido a que las referencias parciales sólo item y no @item, la acción que representa la vista que representa el reutilizable_partial se puede cambiar sin afectar el reutilizable_partial y las otras acciones/vistas que lo representan:

<%= render 'reusable_partial', :item => @other_object.item %>

Además, esto se puede reutilizar en contextos donde no hay @item:

<%= render 'reusable_partial', :item => @duck %>

Si mi @duck cambia en el futuro y ya no grazna como lo espera reutilizable_partial (la interfaz del objeto cambia), también puedo usar un adaptador para pasar el tipo de elemento que espera reutilizable_partial:

<%= render 'reusable_partial', :item => itemlike_duck(@duck) %>

¿Siempre?

Hay muchas situaciones en las que probablemente no necesite parciales desacoplados como este, y a corto plazo es más fácil usar una variable de instancia.Sin embargo, es difícil predecir las necesidades futuras de su aplicación.

Como tal, esto constituye una buena práctica general y tiene un costo relativamente bajo.

Puedes tenerlo de ambas maneras.En la parte superior de tu parcial:

<% item ||= @item %>

De esa manera, funciona con o sin pasar la variable local, proporcionando un valor predeterminado sensato, pero sin inhibir el uso alternativo del parcial.

Voto por a) por una razón muy específica: ¡SECO!Si comienzas a pasar una variable, así, lo siguiente que sabes es que es un desastre, digamos que necesitas cambiar la forma en que se nombra tu variable o algo más sobre ella, entonces debes ir a TODAS tus vistas y cambiarlas. en lugar de UNO parcial.Además, si cambia su parcial, digamos que produce una tabla con algún resultado, cambiará en todas sus vistas, por lo que necesitará saber qué vistas se utilizan, un IDE adecuado debería poder ayudarlo con eso. pero también me gusta tener una pequeña sección de comentarios en la parte superior de la vista, donde solo menciono dónde se usa y por qué, ayuda a otro programador y te ayuda a recordar en caso de que necesites volver a una parte y modificarla.Pero el objetivo del parcial es llamarlo SIN tener que pasar nada desde la vista, de modo que no tengas que modificar todos los lugares desde donde se llama al parcial si esa variable cambia de alguna manera.

En última instancia, esta es una elección de diseño y, para ser honesto, a menos que esté ejecutando un Facebook, la búsqueda adicional que realice no es gran cosa, pero simplemente no es muy SECO.

PD.:Solo lo pensé: en realidad puedes abstraer la forma en que llamas a parcial en un método auxiliar, de modo que si la forma en que llamas a tu parcial necesita cambiar, entonces solo necesitas modificar un lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top