2012-08-30 10 views
38

Mam renderowania częściowy tak:Render częściowy: collection => @array podać nazwę zmiennej

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

Problem jest, że mój częściowy spodziewa zmienną „kontakt”.

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

Po prostu chcę powiedzieć częściowy, aby oczekiwać zmiennej contact. Powtarza się przez @contacts jako contact. Jak mogę to zrobić?

Odpowiedz

102

Znaleziony ten jest również pomocny z docs. Nie jesteś ograniczony do posiadania zmienną o nazwie po częściowym:

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

Aby użyć niestandardowego lokalną nazwę zmiennej ciągu częściowe określ : jako opcja w wywołaniu cząstkowe:

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

Dzięki tej zmianie można uzyskać dostęp do instancji kolekcji @products jako elementu zmiennej lokalnej w częściowej „.

+2

No dobra, to działa naprawdę dobrze! – Avishai

+0

to dziwnie nie działa dla mnie w Rails 4.1. Czy zostało dodane w 4.2 lub coś takiego? – jrochkind

+1

Działa to, ale * tylko jeśli podasz 'partial:' *. Nie możesz zrobić "renderuj" produktu ", kolekcja: @projects, jako:: item'. Musisz podać 'partial:" product "' lub opcja 'as' nie jest zastosowana. – coreyward

12

Dokumentacja na http://guides.rubyonrails.org/layouts_and_rendering.html mówi:

Po częściowym nazywa się liczbę mnogą kolekcji, a następnie indywidualne przypadki częściowego mieć dostęp do członka kolekcji są renderowane za pośrednictwem zmiennej o nazwie po częściowe.

Zostanie przekazana zmienna o nazwie "contact_tile" zamiast "contact". Być może możesz zmienić nazwę swojej częściowej.

Jeśli to nazewnictwo jest ważne, można to zrobić jawnie bez możliwości gromadzenia przez coś podobnego:

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

+1 Chcę Cię upomnieć przez resztę życia – botbot

+1

patrz poniżej odpowiedź. można łatwo zastąpić to zachowanie, zastępując nazwę zmiennej opcją: as. – botbot

+0

Można po prostu napisać "renderuj @ kontakty", konwencja nad konfiguracją, wiesz. '@ contacts' jest tablicą instancji' Contact', więc każdy rekord 'contact' zwraca' 'kontakt/kontakt'' w wywołaniu' to_partial_path' (Railsy to robią pod maską). http://api.rubyonrails.org/classes/ActionView/PartialRenderer.html # class-ActionView :: PartialRenderer-label-Rendering + + domyślny + case – dskecse

7

Najnowsze składni:

index.html.erb

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

_product.html.erb

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

@products stosuje się częściowo jako product

przypadku @products może być uważane za Product.all i product można rozważyć ed jako wiersz produktu, tj. Product.first jako zapętlony wszystkie produkty jeden po drugim.

Powiązane problemy