Trilhos 4 - passando variável para parcial

125

Estou seguindo o tutorial do Ruby on Rails e me deparei com um problema ao tentar passar variáveis ​​para parciais.

Meu _userparcial é o seguinte

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

Gostaria de passar um número para o valor do tamanho. Estou tentando da seguinte maneira, sem sorte.

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

Respostas:

162

Você precisa da sintaxe parcial de renderização completa se estiver passando por locais

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

Torna-se

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

Ou para usar a nova sintaxe de hash

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

Que eu acho que é muito mais legível

jamesc
fonte
Obrigado @ jamesw, mas as imagens ainda são do tamanho 52. É porque eu tenho o tamanho definido para 52 explicitamente na parcial?
Dopplesoldner
1
Sim, na verdade, você está substituindo o valor anterior do tamanho.
Akshay Vishnoi
3
Você pode omitir o localshash para usar a versão curta assim:<%= render @users, size: 30 %>
Pedro Adame Vergara
177

Na API do Rails no PartialRender :

Renderizando o caso padrão

Se você não estiver usando nenhuma das opções, como coleções ou layouts, também poderá usar os padrões abreviados de render para renderizar parciais.

Exemplos:

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

Portanto, você pode usar passar uma variável local sizepara renderizar da seguinte maneira:

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

e depois use-o no _user.html.erbparcial:

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

Note que size: sizeé equivalente a :size => size.

Karim Sonbol
fonte
14
A segunda versão, a sem moradores, salvou minha vida. Obrigado
cassioscabral
6

Ou

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

Ou

render 'user', size: 30

Para usar locals, você precisa partial. Sem o partialargumento, você pode apenas listar variáveis ​​diretamente (não dentro locals)

Espelho318
fonte
5

Não use localsno Rails 4.2+

No Rails 4.2, tive que remover a localspeça e apenas usá-la size: 30. Caso contrário, não passaria a variável local corretamente.

Por exemplo, use isto:

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

Se você estiver usando JavaScript para renderizar, use escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");

Apoorv
fonte
1

Sintaticamente um pouco diferente, mas parece mais limpo na minha opinião:

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
fonte
1

Você pode criar variáveis ​​locais depois de chamar a função de renderização em uma parcial; portanto, se você deseja personalizar uma parcial, pode, por exemplo, renderizá-la _form.html.erbpor:

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

Dessa forma, você pode acessar no rótulo parcial para o botão e o URL, esses serão diferentes se você tentar criar ou atualizar um registro. finalmente, para acessar essas variáveis ​​locais, você deve inserir seu 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
fonte