2009-12-05 13 views
19

Tengo un parcial:@object en unos rieles parciales rendir

'perfiles/_show.html.erb'

que contiene un código como

<%= @profile.fullname %> 

que estoy tratando de hacer el parcial, pero no estoy seguro de cómo pasar el @perfil. Traté de usar local pero aparentemente establece 'profile' en mi parcial en lugar de '@profile'.

<%= render :partial => 'profiles/show', :locals => {:profile => @app.profile} %> 

¿Hay alguna forma de pasarlo como @object en lugar de objeto, o está diseñado de esta manera?

Respuesta

32

¿Por qué es tan importante que use una variable de instancia (variables cuyos nombres comienzan con '@', por ejemplo: @object) en su parcial? No es un buen hábito entrar. El uso de variables de instancia en parciales complica el flujo de control, lo que facilita los errores y hace que la reutilización de parciales sea más difícil. Este blog post explica el problema un poco más en profundidad.

Realmente tienes dos opciones. La primera opción es la solución sugerida.

  1. Cambie todas las variables de instancia a una variable local y páselo al argumento parcial con los locales del argumento render.

  2. Establezca la variable de instancia antes de que se represente el parcial. Los parciales tienen acceso a todas las variables de instancia que configura su controlador.

De nuevo, las variables de instancia en los parciales son malas. Nunca debe establecer variables de instancia solo porque sus parciales ya están escritas para usarlas. Reescribe el parcial en su lugar.

+2

FWIW, el enlace ahora está roto –

+4

[Un enlace alternativo a un artículo diferente] (http://rails-bestpractices.com/posts/27-replace-instance-variable-with-local-variable) – Zabba

+1

Este ^^ artículo parece haberse mudado aquí: http://rails-bestpractices.com/posts/2010/07/24/replace-instance-variable-with-local-variable/ –

1

Siempre puede hacer @profile = profile en el parcial.

+0

Es una mala idea establecer variables de instancia en parciales. Puede conducir a todo tipo de problemas y será un dolor de localizar. – Josh

1

esto es más sencillo

<%= render :partial => "profiles/show", :collection => @profiles %> 

en _show.html.erb parcial

<%= profile.fullname %> 

esperanza ayudó

+2

Esto solo funciona si el que llama del parcial tiene una colección de perfiles * y * la persona que llama quiere presentar el parcial una vez por cada elemento en la colección. La pregunta no tiene ninguno de estos. –

14

De hecho, citando this entrada del blog que usted debe saber:

Un parcial es un plantilla de vista reutilizable, le permite modularizar los componentes que componen una página particular en piezas lógicas cohesivas . Cuando los datos requeridos no se pasan a un parcial, a menudo es difícil de reutilizar o cambiar más adelante.

El sitio de rails guides explica algunos casos de uso sencillos:

También puede pasar variables locales en los parciales, lo que hace aún más potente y flexible.Por ejemplo, puede utilizar esta técnica para reducir la duplicación entre las nuevas y editar las páginas, si bien mantienen un poco de contenido distinto ...

Así, en su caso concreto hay una manera sencilla y potente para hacer que

<%= render partial: 'show', locals: {profile: @profile} %> 

consejo extra:
Probablemente un espectáculo llamado parcial no es una buena opción, darle un nombre más significativo en relación con lo que está intentando volver a utilizar. Esto suena aún más el error/confusión propensos en un escenario REST cuando en realidad tienen un muestran método, por lo que probablemente sería una _show.html.erb archivo y un archivo show.html.erb.

Espero que esto haya ayudado.

4

para los carriles 3 +, la respuesta a su pregunta real es:

<%= render 'profiles/show', :@profile => blah %> 

Su parcial a partir de ahora ver @profile localmente.

No estoy diciendo que este sea un buen enfoque. Sinceramente, no estoy seguro de si esto es feo o no. Pero funciona.

+0

Esto generalmente es ** no ** un buen enfoque, pero puede ser útil en algunos casos. Estoy trabajando en un sitio ahora, donde hay una complicada lógica de dsiplay y tenemos un montón de parciales, por lo que era más fácil tener una variable global localizada que preocuparse por pasarla a todos los parciales. – Josh

+0

No, pero es la única respuesta precisa a la pregunta que realmente hizo. Todas las demás respuestas son enfoques alternativos. –

+0

Bastante, pero a veces los enfoques alternativos son mejores que simplemente responder a la pregunta. Muchas veces las personas no están realmente seguras de lo que necesitan y solo tratan de entender cómo funcionan las cosas y las mejores prácticas. Como dije antes, he usado este enfoque, pero no es una mejor práctica. – Josh