Rieles 4: pasar variable a parcial

125

Estoy siguiendo el tutorial de Ruby on Rails y he encontrado un problema al intentar pasar variables a parciales.

Mi _userparcial es la siguiente

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

Me gustaría pasar un número para el valor del tamaño. Estoy intentando lo siguiente sin suerte.

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

Respuestas:

162

Necesita la sintaxis parcial de renderizado completo si está pasando locales

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

Se convierte

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

O para usar la nueva sintaxis hash

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

Que creo que es mucho más legible

jamesc
fuente
Gracias @jamesw, pero las imágenes todavía tienen el tamaño 52. ¿Es porque tengo el tamaño establecido en 52 explícitamente en el parcial?
dopplesoldner
1
Sí, en realidad, está anulando el valor anterior de tamaño.
Akshay Vishnoi
3
Puede omitir el localshash para usar la versión corta de esta manera:<%= render @users, size: 30 %>
Pedro Adame Vergara
177

Desde la API de Rails en PartialRender :

Representando el caso predeterminado

Si no va a utilizar ninguna de las opciones, como colecciones o diseños, también puede utilizar los valores predeterminados abreviados de render para renderizar parciales.

Ejemplos:

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

Por lo tanto, puede usar pasar una variable local sizepara representar de la siguiente manera:

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

y luego usarlo en el _user.html.erbparcial:

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

Tenga en cuenta que size: sizees equivalente a :size => size.

Karim Sonbol
fuente
14
El segundo render, el que no tiene locales, me salvó la vida. Gracias
cassioscabral 05 de
6

Ya sea

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

O

render 'user', size: 30

Para usar locals, necesitas partial. Sin el partialargumento, puede simplemente enumerar variables directamente (no dentro locals)

Espejo318
fuente
5

No usar localsen Rails 4.2+

En Rails 4.2 tuve que quitar la localsparte y simplemente usarla size: 30en su lugar. De lo contrario, no pasaría la variable local correctamente.

Por ejemplo, use esto:

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

Si está utilizando JavaScript para renderizar, use escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");

Apoorv
fuente
1

Sintácticamente un poco diferente, pero se ve más limpio en mi opinión:

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" }
Alexander Luna
fuente
1

Puede crear variables locales una vez que llame a la función de representación en un parcial, por lo tanto, si desea personalizar un parcial, puede, por ejemplo, representar el parcial _form.html.erbde la siguiente manera:

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

De esta manera, puede acceder de forma parcial a la etiqueta para el botón y la URL, que son diferentes si intenta crear o actualizar un registro. finalmente, para acceder a estas variables locales, debe ingresar su código 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
fuente