66 votes

Passage de paramètres à une vue partielle

J'ai une vue qui affiche plusieurs images et les tags associés à ces images. J'ai décidé d'utiliser une vue partielle pour chaque image et ses tags, mais je n'arrive pas à passer l'objet image dans la vue partielle. Voici le code de la vue principale :

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

Voici le code 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 cette que je peux passer dans l'objet image de la manière dont je le fais actuellement. J'ai essayé de passer l'id à travers un hash d'options sur la méthode de rendu, et cela n'a pas fonctionné non plus. L'erreur que j'obtiens est la suivante :

undefined method `model_name' for Symbol:Class

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

98voto

vinceh Points 2387
<%= render partial: "image_tag", locals: {image: i} %>

est la façon de passer des variables aux partiels.

65voto

MFarmer Points 266

Une autre chose à prendre en compte pour ceux qui ont des difficultés à envoyer des valeurs à un partiel. Si vous omettez la mention "partial : avant votre chemin partiel, comme suit... :

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

...il semble que vous ne puissiez pas accéder directement aux valeurs de hachage locales. Vous devrez plutôt faire ce qui suit :

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

Cependant, y compris "partial : avant votre chemin partiel, comme suit... :

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

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

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

Juste une chose à prendre en compte, j'ai été confronté à ce problème en essayant d'accéder aux valeurs de hachage locales et j'ai réalisé que j'avais omis l'option 'partial:' de la composante.

11voto

Msencenb Points 2313

Vous pouvez également passer l'objet entier à un partial comme ceci :

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

Vous devez remplacer i par image dans votre cas et chemin partiel par le nom de votre partiel. A l'intérieur du partial, il aura accès à une variable locale avec le même nom que le nom du partial. Ainsi, si le nom de votre partiel est "image", la variable locale image sera l'objet que vous lui passerez.

EDIT : En regardant les guides de rails, il semble que dans rails 3 l'objet :est maintenant accessible comme une variable d'instance au lieu d'un local, donc @image serait ce que vous utilisez dans le partiel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X