2012-08-30 9 views
38

estoy Una representación parcial de la siguiente manera:Render parcial: Colección => @array especificar nombre de la variable

$("#box_container").html("<%= escape_javascript(render :partial => 'contacts/contact_tile', :collection => @contacts) %>") 

problema es que mi parcial está contando con la variable 'contacto'.

ActionView::Template::Error (undefined local variable or method `contact' 

Simplemente quiero decir la parcial esperar una variable contact. Debe iterar a través de @contacts como contact. ¿Cómo puedo hacer eso?

Respuesta

102

encontraron esta también es útil a partir de los documentos. No está limitado a tener la variable lleva el nombre del parcial:

http://guides.rubyonrails.org/layouts_and_rendering.html

Para utilizar un nombre de variable personalizada local dentro de la parcial, especifique la : como opción en la llamada a la parcial:

<%= render :partial => "product", :collection => @products, :as => :item %> 

Con este cambio, puede acceder a una instancia de la colección @products como la variable local dentro del elemento parcial."

+2

¡Qué bueno, eso funciona muy bien! – Avishai

+0

esto extrañamente no funciona para mí en Rails 4.1. ¿Fue agregado en 4.2 o algo así? – jrochkind

+1

Esto funciona, pero * solo si especifica 'partial:' *. No se puede hacer 'renderizar 'producto', colección: @projects, como:: item'. Debe especificar 'partial:" product "' o no se aplica la opción 'as'. – coreyward

12

La documentación en http://guides.rubyonrails.org/layouts_and_rendering.html dice:

Cuando un parcial se denomina con una colección pluralizado, a continuación, los casos individuales del parciales tienen acceso al miembro de la colección que se presta a través de una variable llamada después el parcial.

Por lo tanto, se pasará una variable llamada "contact_tile" en lugar de "contacto". Tal vez puedas cambiar el nombre de tu parcial.

Si esta nomenclatura es importante, que podría hacerlo de manera explícita sin la opción colección por algo como:

@contacts.each { |contact| render :partial => 'contacts/contact_tile', :locals => {:contact => contact } } 
+1

+1 quiero votarte por el resto de mi vida – botbot

+1

ver abajo respuesta. es fácil anular este comportamiento sobrescribiendo el nombre de la variable con la opción: como. – botbot

+0

Simplemente podría escribir 'render @ contacts', convención sobre configuración, ya sabe. '@ contacts' es una matriz de instancias' Contact', por lo que cada registro 'contact' devuelve' 'contacts/contact'' en la invocación 'to_partial_path' (Rails lo hace bajo el capó). http://api.rubyonrails.org/classes/ActionView/PartialRenderer.html # class-ActionView :: PartialRenderer-label-Rendering + the + default + case – dskecse

7

reciente sintaxis son:

index.html.erb

<%= render partial: "product", collection: @products %> 

_product.html.erb

<p>Product Name: <%= product.name %></p> 

@products se utiliza en parcial como product

Dónde @products pueden ser considerado como Product.all y product se puede considerar ed como una fila de producto, es decir, Product.first, como un bucle de todos los productos uno por uno.

Cuestiones relacionadas