Parameter an Teilansicht übergeben

69

Ich habe eine Ansicht, in der mehrere Bilder und die zugehörigen Tags dieser Bilder angezeigt werden. Ich habe beschlossen, für jedes Bild und seine Tags eine Teilansicht zu verwenden, habe jedoch Probleme, das Bildobjekt in die Teilansicht zu übertragen. Hier ist der relevante Code der Hauptansicht:

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

Hier ist der relevante Code der Teilansicht (die Teilansicht heißt _image_tag.html.erb):

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

Ich habe in diesem Thread gelesen, dass ich das Bildobjekt so übergeben kann, wie ich es gerade mache. Ich habe versucht, die ID über einen Options-Hash für die Render-Methode zu übergeben, und das hat auch nicht funktioniert. Der Fehler, den ich bekomme, ist:

undefined method `model_name' for Symbol:Class

zentriert um die Linie, in der ich rendere: teilweise in der Hauptansicht.

jnevelson
quelle

Antworten:

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

Auf diese Weise würden Sie Variablen an Partials übergeben.

vinceh
quelle
Ich hatte das tatsächlich schon und bekam genau den Fehler, den ich gerade bin. Etwas anderes, das das Problem verursacht?
Jnevelson
Ich würde vermuten, dass "image_tag" eine Rails-Hilfsmethode ist und mit Ihrem Teilnamen kollidiert. Haben Sie versucht, Ihren Teil umzubenennen?
Salt.racer
Fairer Punkt angesichts des Kontextes, aber ich habe nur "Bild" in die Frage gesetzt, um es einfach zu halten. Mein eigentlicher Code hat einen anderen Namen, das ist also nicht das Problem.
Jnevelson
Können Sie sicherstellen, dass Sie tatsächlich das richtige Element übergeben, und sicherstellen, dass @items tatsächlich das ist, was Sie denken? Machen Sie einige putsAnweisungen, bevor Sie Ihren Teil rendern, um sicherzugehen, und einige putsAussagen in Ihrem Teil ganz oben. Können Sie auch versuchen, das GANZE einzureichen @imagesund einzuchecken? Dies ist, was ich tue, wenn ich herausfinden muss, was mit Variablen los ist. Halten uns auf dem Laufenden! :)
vinceh
Nun, ich habe es herausgefunden. Das Problem war, dass ich den Ansichtsnamen des Teils als Symbol anstelle einer Zeichenfolge hatte. Nachdem ich 'render: teilweise =>: image_tag' in 'render: teilweise => "image_tag"' geändert hatte, funktionierte alles. Ich bin mir nicht sicher, warum die Symboldarstellung nicht funktioniert, aber danke für die Hilfe!
Jnevelson
69

Noch etwas zu beachten für diejenigen, die möglicherweise Probleme haben, Werte an einen Teil zu senden. Wenn Sie das 'partielle:' vor Ihrem partiellen Pfad weglassen , wie folgt ...:

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

... Sie können anscheinend nicht direkt auf die lokalen Hash-Werte zugreifen. Vielmehr müssten Sie Folgendes tun:

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

Jedoch einschließlich der ‚Teil:‘ vor Ihrem partiellen Pfad ein, wie folgt ...:

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

... ermöglicht Ihnen den direkten Zugriff auf die Hash-Werte wie folgt:

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

Nur etwas zu beachten, ich wurde von diesem Problem überrascht, als ich versuchte, auf die lokalen Hash-Werte zuzugreifen, und stellte fest, dass ich die Komponente 'partiell:' weggelassen hatte .

MFarmer
quelle
Du hast mich gerettet. Vielen Dank!
Hbobenicio
1
Pithier Rails 4 Syntax<%= render partial: 'my_partial', locals: {greeting: 'Hello world', x: 36} %>
Jerome
11

Sie können das gesamte Objekt auch wie folgt an einen Teil übergeben:

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

Sie würden i in Ihrem Fall durch image und partiellen Pfad durch das ersetzen, was Ihr partieller heißt. Innerhalb des Teils hätte es Zugriff auf eine lokale Variable mit demselben Namen wie der Teilname. Wenn Ihr Partialname also "image" lautet, ist das lokale Variablenbild das Objekt, das Sie übergeben.

BEARBEITEN: Wenn Sie sich die Rails-Hilfslinien ansehen, sehen Sie wie in Rails 3 aus. Auf das Objekt: wird jetzt als Instanzvariable anstatt als lokale Variable zugegriffen, sodass @image das ist, was Sie im Teil verwenden.

Msencenb
quelle
2
Ich denke nicht, dass du EDIT:richtig bist. Zitat : In früheren Versionen von Rails suchte die lokale Standardvariable nach einer Instanzvariablen mit demselben Namen wie der Teil im übergeordneten Element . Dieses Verhalten war in 2.3 veraltet und wurde in Rails 3.0 entfernt. In Ihrer Antwort hat der Wert des Objekts , wie :objectwird in dem Teil als lokaler Variable mit dem Namen zugänglich sein partialpath(nicht @partialpath, @imageoder image)
Zabba