web-dev-qa-db-fra.com

Passer des paramètres à une vue partielle

J'ai une vue qui affiche plusieurs images et les balises associées à ces images. J'ai décidé d'utiliser une vue partielle pour chaque image et ses balises, mais j'ai du mal à passer l'objet image dans la vue partielle. Voici le code pertinent de la vue principale:

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

Voici le code pertinent de la vue partielle (la vue partielle est nommée _image_tag.html.erb):

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

J'ai lu dans le fil this que je peux passer dans l'objet image comme je le fais actuellement. J'ai essayé de passer l'id via un hachage d'options sur la méthode de rendu, et cela n'a pas fonctionné non plus. L'erreur que je reçois est:

undefined method `model_name' for Symbol:Class

centré autour de la ligne où j'appelle render: partial dans la vue principale.

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

est de savoir comment passer des variables à des partiels.

96
vinceh

Quelque chose d'autre à considérer pour ceux qui peuvent avoir du mal à envoyer des valeurs à un partiel. Si vous omettez le 'partial:' avant votre chemin partiel, comme ceci ...:

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

... il semble que vous ne pourrez pas accéder directement aux valeurs de hachage locales. Vous devez plutôt effectuer les opérations suivantes:

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

Cependant, y compris 'partial:' avant votre chemin partiel, comme ce qui suit ...:

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

... vous permet d'accéder directement aux valeurs de hachage, comme ceci:

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

Juste quelque chose à considérer, je me suis fait trébucher par ce problème lorsque j'essayais d'accéder aux valeurs de hachage locales et j'ai réalisé que j'avais omis le composant 'partial:' .

60
MFarmer

Vous pouvez également passer l'objet entier à un partiel comme celui-ci:

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

Vous remplaceriez i par l'image dans votre cas et le chemin partiel par ce que votre partiel est appelé. À l'intérieur du partiel, il aurait accès à une variable locale du même nom que le nom du partiel. Donc, si votre nom partiel est "image", l'image variable locale sera l'objet que vous transmettez.

EDIT: En regardant les Rails guides ressemble à Rails 3 l'objet: est désormais accessible en tant que variable d'instance au lieu d'une variable locale, donc @image serait ce que vous utilisez dans le partiel.

11
Msencenb