Rails 4 - passaggio da variabile a parziale


125

Sto seguendo il tutorial di Ruby on Rails e ho riscontrato un problema durante il tentativo di passare le variabili ai partials.

Il mio _userparziale è il seguente

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

Vorrei inserire un numero per il valore della dimensione. Sto provando come segue senza fortuna.

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

Risposte:


162

È necessaria la sintassi parziale del rendering completo se si passano i locali

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

diventa

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

O per usare la nuova sintassi hash

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

Che penso sia molto più leggibile


Grazie @ jamesw, ma le immagini sono ancora di dimensione 52. È perché ho impostato esplicitamente la dimensione su 52 nel parziale?
dopplesoldner

1
Sì, in realtà, stai sovrascrivendo il valore precedente di size.
Akshay Vishnoi

3
Puoi omettere l' localshash per usare la versione breve in questo modo:<%= render @users, size: 30 %>
Pedro Adame Vergara

177

Dall'API Rails su PartialRender :

Rendering del caso predefinito

Se non utilizzerai nessuna delle opzioni come raccolte o layout, puoi anche utilizzare le impostazioni predefinite di rendering per il rendering parziale.

Esempi:

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

Quindi, puoi usare passa una variabile locale sizeper eseguire il rendering come segue:

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

e poi usalo nel _user.html.erbparziale:

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

Nota che size: sizeè equivalente a :size => size.


14
Il secondo rendering, quello senza gente del posto, mi ha salvato la vita. Grazie
cassioscabral

6

O

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

O

render 'user', size: 30

Per usare locals, hai bisogno partial. Senza l' partialargomento, puoi semplicemente elencare le variabili direttamente (non all'interno locals)


5

Non usare localsin Rails 4.2+

In Rails 4.2 ho dovuto rimuovere la localsparte e usarla al suo size: 30posto. Altrimenti, non passerebbe correttamente la variabile locale.

Ad esempio, usa questo:

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

3

Se stai usando JavaScript per il rendering, usa escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");


1

Sintatticamente un po 'diverso ma a mio parere sembra più pulito:

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

Puoi creare variabili locali una volta chiamata la funzione render su un partial, quindi se vuoi personalizzare un partial puoi ad esempio renderizzare il partial _form.html.erb:

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

in questo modo puoi accedere in parte all'etichetta del pulsante e all'URL, quelli sono diversi se provi a creare o aggiornare un record. infine, per accedere a queste variabili locali devi inserire il tuo codice 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%>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.