Rails 4 - passage de variable à partiel

125

Je suis le didacticiel Ruby on Rails et j'ai rencontré un problème en essayant de transmettre des variables aux partiels.

Mon _userpartiel 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'essaye comme suit sans aucune chance.

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

Réponses:

162

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

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

Devient

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

Ou pour utiliser la nouvelle syntaxe de hachage

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

Ce qui, je pense, est beaucoup plus lisible

Jamesc
la source
Merci @jamesw, mais les images sont toujours de taille 52. Est-ce parce que j'ai la taille définie à 52 explicitement dans le partiel?
dopplesoldner
1
Oui en fait, vous remplacez la valeur précédente de size.
Akshay Vishnoi
3
Vous pouvez omettre le localshachage pour utiliser la version courte comme suit:<%= render @users, size: 30 %>
Pedro Adame Vergara
177

Depuis l'API Rails sur PartialRender :

Rendu de la casse 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 du 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 %>

Ainsi, vous pouvez utiliser passer une variable locale sizepour effectuer le rendu comme suit:

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

puis utilisez-le dans le _user.html.erbpartiel:

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

Notez que cela size: sizeéquivaut à :size => size.

Karim Sonbol
la source
14
Le deuxième rendu, celui sans habitants, m'a sauvé la vie. Merci
cassioscabral
6

Soit

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

Ou

render 'user', size: 30

Pour l'utiliser locals, vous avez besoin partial. Sans l' partialargument, vous pouvez simplement lister les variables directement (pas à l'intérieur locals)

Miroir318
la source
5

Ne pas utiliser locals dans Rails 4.2+

Dans Rails 4.2, j'ai dû retirer la localspièce et simplement utilisersize: 30 place. Sinon, il ne passerait pas correctement la variable locale.

Par exemple, utilisez ceci:

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

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

Apoorv
la source
1

Syntaxiquement un peu différent mais cela semble plus propre à mon avis:

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" }
Alexandre Luna
la source
1

Vous êtes capable de créer des variables locales une fois que vous appelez la fonction de rendu sur un partiel, donc si vous souhaitez personnaliser un partiel vous pouvez par exemple rendre le partiel _form.html.erben:

<%= render 'form', button_label: "Create New Event", url: new_event_url %>
<%= render 'form', button_label: "Update Event", url: edit_event_url %>

de cette façon, vous pouvez accéder dans le partiel à l'étiquette pour le bouton et l'URL, ceux-ci sont différents si vous essayez de créer ou de mettre à jour un enregistrement. enfin, pour accéder à ces variables locales, vous devez mettre votre code local_assigns[:button_label]( local_assigns[:name_of_your_variable])

<%=form_for(@event, url: local_assigns[:url]) do |f|  %>
<%= render 'shared/error_messages_events' %>
<%= f.label :title ,"Title"%>
  <%= f.text_field :title, class: 'form-control'%>
  <%=f.label :date, "Date"%>
  <%=f.date_field :date, class: 'form-control'  %>
  <%=f.label :description, "Description"%>
  <%=f.text_area :description, class: 'form-control'  %>
  <%= f.submit local_assigns[:button_label], class:"btn btn-primary"%>
<%end%>
Carlos
la source