2012-08-30 9 views
38

Ich bin ein teilweise wie folgt zu machen:Render Teil: Sammlung => @array Variablennamen angeben

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

Problem ist, dass mein Teil der Variable 'Kontakt' erwartet.

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

Ich möchte einfach die teilweise sagen, eine Variable contact zu erwarten. Sollte durch @contacts als contact iterieren. Wie mache ich das?

Antwort

102

Fand dieses von den docs auch hilfreich. Sie sind nach dem Teil nicht beschränkt genannt der Variable mit:

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

einen benutzerdefinierten lokalen Variablennamen innerhalb des Teils zu verwenden, geben Sie die : als Option in dem Aufruf den Teil:

<%= render :partial => "product", :collection => @products, :as => :item %> 
Mit dieser Änderung

, können Sie eine Instanz der @products Sammlung als die lokalen Elementvariable Zugriff innerhalb des Teils.“

+2

Oh schön, das funktioniert wirklich gut! – Avishai

+0

das funktioniert seltsamerweise nicht für mich in Rails 4.1. Wurde es in 4.2 oder etwas hinzugefügt? – jrochkind

+1

Das funktioniert, aber * nur wenn Sie 'partially:' * angeben. Sie können "Produkt" nicht rendern, Sammlung: @projects, wie:: item'. Sie müssen angeben, dass "partially:" product "' oder die Option 'as' nicht angewendet wird. – coreyward

12

Die vorliegende Dokumentation http://guides.rubyonrails.org/layouts_and_rendering.html sagt:

Wenn ein teilweise mit einer Pluralisierung Sammlung genannt wird, dann wird die einzelne Instanzen des Teils haben Zugang zum Mitglied der Sammlung über eine benannte Variable gemacht werden, nachdem die teilweise.

Also wird eine Variable namens "contact_tile" statt "contact" übergeben. Vielleicht kannst du deine Partials einfach umbenennen.

Wenn diese Namensgebung wichtig ist, können Sie es explizit wie ohne die Sammlung Option könnte etwas tun:

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

+1 Ich möchte Sie für den Rest meines Lebens upvote – botbot

+1

siehe unten beantworten. Es ist einfach, dieses Verhalten zu überschreiben, indem Sie den Namen der Variablen mit der Option: as überschreiben. – botbot

+0

Sie könnten einfach 'render @ contacts' schreiben, Konvention über Konfiguration, wissen Sie. '@ contacts' ist ein Array von' Contact'-Instanzen, so dass jeder 'contact'-Datensatz 'contacts/contact' im' to_partial_path'-Aufruf zurückgibt (Rails tut dies unter der Haube). http://api.rubyonrails.org/classes/ActionView/PartialRenderer.html # class-ActionView :: PartialRenderer-label-Rendering + die + default + case – dskecse

7

Neueste Syntax sind:

index.html.erb

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

_product.html.erb

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

@products in Teil als product verwendet wird

Wo @products sein kann als Product.all10 betrachtet werden und product kann berücksichtigt werden als eine Reihe von Produkten, d. h. Product.first, als alle Produkte eins nach dem anderen geschleift werden.