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} %>

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


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.


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)


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 %>

3

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


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" }

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%>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.