141 votes

Passer une variable dans un partiel, rails 3 ?

J'ai une boucle comme ça :

<% @posts.each do |post| %>
  <% render middle %>
<% end %>

Ensuite, dans mon partiel du milieu, comment puis-je accéder au message actuel ?

0 votes

Bonjour Elliot Je l'utilise sur un échafaudage standard. J'utilise l'intérieur de index.html.erb pour rendre _show.html.erb où show partial contient modal. Tout fonctionne bien sauf que lorsque j'appuie sur le lien show, il montre le même id au lieu de montrer des id différents.

236voto

polarblau Points 10127

Essayez ça :

<% @posts.each do |post| %>
  <%= render 'middle', :post => post %>
<% end %>

Comme ceci, vous aurez une variable locale post disponibles dans le cadre du partiel.

18 votes

Vous avez besoin de <%= %> pas de <% %> balises ou sinon il ne sera pas rendu

4 votes

Gardez à l'esprit que vous aurez besoin <%= render 'middle', :post => post %> pour rails 3.1.x

124voto

Stefaan Colman Points 2719

Donnez-le au partiel comme une variable locale

<%= render :partial => 'middle', :locals => { :post => post } %>

Bien sûr, rails dispose également d'un raccourci pour rendre les collections :

<%= render :partial => 'post', :collection => @posts %>

Dans ce cas, il appellera le post partiel pour chaque post avec une variable locale 'post'.

Vous pouvez même rendre un modèle d'espacement entre chaque message :

<%= render :partial => 'post', :collection => @posts, :spacer_template => 'post_divider' %>

14 votes

Je ne connaissais pas l'option :spacer_template, vraiment sympa. Merci !

11 votes

Notez que le hash :locals n'est pas nécessaire lorsque vous utilisez Rails 3. Le hash arguments est converti en arguments qui sont passés au partial.

4 votes

J'avais toujours besoin du hash :locals pour que ça marche J'utilise la version 3.2.12

14voto

Felix Andersen Points 604
<% @posts.each do |post| %>
  <% render middle, :post => post %>
<% end %>

Vous pouvez maintenant accéder à post en tant que variable locale post dans la partie

10voto

sevenseacat Points 12086

Remplacer <%= render middle %> con <%= render middle, :post => post %> . Ensuite, dans votre middle partiel, vous pouvez accéder à la post variable.

0voto

fatfrog Points 1204

Vous pouvez remplacer l'ensemble de chaque bloc par ceci :

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

Ou même plus court :

<%= render @posts %>

Documentation complète (section 3.2) https://guides.rubyonrails.org/action_view_overview.html

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