2011-07-12 20 views
59

Mam widok wyświetlający wiele obrazów i powiązanych z nimi znaczników. Zdecydowałem się użyć częściowego widoku dla każdego obrazu i jego znaczników, ale mam problem z przekazaniem obrazu obiektu do częściowego widoku. Oto odpowiedni kod główny widok na:Przekazywanie parametrów do widoku częściowego

<table> 
    <% @images.each do |i| %> 
    <tr> 
     <%= render :partial => :image_tag, :image => i %> 
    </tr> 
    <% end %> 
</table> 

Oto odpowiedni kod częściowego widoku za (częściowy widok nazwie _image_tag.html.erb):

<table> 
    <%= image.id %> 
    <%= image_tag image.src %> 
</table> 

czytałem w this wątku, który można przekazać w obiekcie obrazu w taki sposób, w jaki aktualnie to robię. Próbowałem przekazać id poprzez hash opcji w metodzie renderowania, które również nie działało. Otrzymuję błąd:

undefined method `model_name' for Symbol:Class 

wyśrodkowany wokół linii, w której wywoływam render: częściowy w widoku głównym.

Odpowiedz

88
<%= render partial: "image_tag", locals: {image: i} %> 

to sposób przekazywania zmiennych do częściowych.

+0

Właściwie to już miałem i otrzymywałem dokładnie ten sam błąd, którym obecnie jestem. Coś jeszcze powoduje problem? – jnevelson

+0

Domyślam się, że "image_tag" jest metodą pomocniczą rails i koliduje z twoją częściową nazwą. Czy próbowałeś zmienić nazwę częściowej? –

+0

Punkt widzenia z punktu widzenia kontekstu, ale umieszczam tylko "obraz" w pytaniu, aby zachować prostotę. Mój rzeczywisty kod ma inną nazwę, więc to nie jest problem. – jnevelson

10

Można także przekazać cały obiekt do częściowego tak:

<%= render :partial => "partialpath", :object => :image %> 

Można by wymienić ja z obrazem w Twoim przypadku i częściową ścieżkę z niezależnie częściowym nazywa. Wewnątrz częściowej miałby dostęp do zmiennej lokalnej o tej samej nazwie co nazwa partials. Więc jeśli twoja nazwa częściowa to "obraz", to lokalny obraz zmienny będzie obiektem, który przekazujesz.

EDYCJA: patrząc na prowadnice szyn wygląda jak w szynach 3: obiekt jest teraz dostępny jako zmienna instancji zamiast lokalny więc @image byłby tym, czego używasz w częściowym.

+2

Nie sądzę, że twoje "EDIT:" jest poprawne. [Cytat] (http://guides.rubyonrails.org/layouts_and_rendering.html#passing-local-variables): * We wcześniejszych wersjach Railsów domyślna zmienna lokalna szukałaby zmiennej instancji o tej samej nazwie, co nazwa częściowa rodzic. To zachowanie zostało wycofane w wersji 2.3 i zostało usunięte w Rails 3.0. * W twojej odpowiedzi wartość obiektu przekazywana jako ': object' będzie dostępna wewnątrz części jako zmienna lokalna o nazwie' partialpath' (nie '@ partialpath' , '@ image' lub' image') – Zabba

+0

Zgadzam się z @Zabba – amulous

53

Coś innego do rozważenia dla tych, którzy mogą mieć problemy z wysłaniem wartości do części. Jeśli pominąć „częściowe:” przed częściowym ścieżce, tak jak ...:

<%= render 'my_partial', :locals => {:greeting => 'Hello world', :x => 36} %> 

... Wydaje się, że będziesz w stanie uzyskać dostęp do miejscowych wartości hash bezpośrednio. Raczej trzeba by wykonać następujące czynności:

<div> 
    <h1> <%= locals[:greeting] %> , my x value is <%= locals[:x] %> </h1> 
</div> 

Jednak tym 'częściowe:' przed częściowym ścieżki, jak poniżej ...:

<%= render partial: 'my_partial', :locals => {:greeting => 'Hello world', :x => 36} %> 

... pozwala bezpośredni dostęp do wartości hash, tak:

<div> 
    <h1> <%= greeting %> , my x value is <%= x %> </h1> 
</div> 

tylko coś do rozważenia, byłem coraz potknął się ten problem podczas próby dostępu hash locals wartości i zrealizowałem, że pominąłem element "częściowy:".

+0

Uratowałeś mnie. Dzięki! – hbobenicio

+1

szyny pithier 4 składnia '<% = renderowanie częściowe: 'my_partial', locals: {greeting: 'Hello world', x: 36}%>' – Jerome

Powiązane problemy