web-dev-qa-db-fra.com

Rails 4 - passage de variable à partielle

Je suis le tutoriel Ruby on Rails et j'ai rencontré un problème en essayant de passer des variables à des partiels.

Mon _user partiel est le suivant

<li>
  <%= gravatar_for user, size: 52 %>
  <%= link_to user.name, user %>
</li>

Je voudrais passer un nombre pour la valeur de la taille. J'essaie comme suit sans aucune chance.

<%= render @users, :locals => {:size => 30} %>

Merci d'avance!

112
dopplesoldner

Vous avez besoin de la syntaxe partielle de rendu complet si vous passez des sections locales

<%= render @users, :locals => {:size => 30} %>

Devient

<%= render :partial => 'users', :collection => @users, :locals => {:size => 30} %>

Ou utiliser la nouvelle syntaxe de hachage

<%= render partial: 'users', collection: @users, locals: {size: 30} %>

Ce que je pense est beaucoup plus lisible

149
jamesc

Depuis le Rails api on PartialRender :

Rendu le cas par défaut

Si vous n'utilisez aucune des options telles que les collections ou les mises en page, vous pouvez également utiliser les valeurs par défaut abrégées de rendu pour rendre les partiels.

Exemples:

# Instead of <%= render partial: "account" %>
<%= render "account" %>

# Instead of <%= render partial: "account", locals: { account: @buyer } %>
<%= render "account", account: @buyer %>

# @account.to_partial_path returns 'accounts/account', so it can be used to replace:
# <%= render partial: "accounts/account", locals: { account: @account} %>
<%= render @account %>

# @posts is an array of Post instances, so every post record returns 'posts/post' on `to_partial_path`,
# that's why we can replace:
# <%= render partial: "posts/post", collection: @posts %>
<%= render @posts %>

Donc, vous pouvez utiliser pass une variable locale size pour le rendu comme suit:

<%= render @users, size: 50 %>

puis utilisez-le dans le partiel _user.html.erb:

<li>
    <%= gravatar_for user, size: size %>
    <%= link_to user.name, user %>
</li>

Notez que size: size est équivalent à :size => size.

168
Karim Sonbol

Soit

render partial: 'user', locals: {size: 30}

Ou

render 'user', size: 30

Pour utiliser locals, vous avez besoin de partial. Sans l'argument partial, vous pouvez simplement lister les variables directement (pas dans locals)

5
Mirror318

Si vous utilisez JavaScript pour le rendu, utilisez escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");

3
Apoorv

N'utilisez pas locals dans Rails 4.2+

Dans Rails 4.2, je devais supprimer la partie locals et simplement utiliser size: 30 à la place. Sinon, la variable locale ne serait pas transmise correctement.

Par exemple, utilisez ceci:

<%= render @users, size: 30 %>
3
Joshua Pinter

C'est un peu différent du point de vue syntaxique, mais à mon avis, il semble plus propre.

render 'my_partial', locals: { title: "My awesome title" }

# not a big fan of the arrow key syntax
render 'my_partial', :locals => { :title => "My awesome title" }
1
Alexander Luna