Rails 4 - przekazywanie zmiennej do częściowej

125

Postępuję zgodnie z samouczkiem Ruby on Rails i napotkałem problem podczas próby przekazywania zmiennych do podrzędnych.

Mój _user stronniczość jest następująca

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

Chciałbym podać liczbę dla wartości rozmiaru. Bez powodzenia próbuję wykonać następujące czynności.

<%= render @users, :locals => {:size => 30} %>
dopplesoldner
źródło

Odpowiedzi:

162

Jeśli przekazujesz lokalne pliki, potrzebujesz pełnej składni renderowania

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

Staje się

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

Lub użyć nowej składni skrótu

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

Co moim zdaniem jest znacznie bardziej czytelne

jamesc
źródło
Dzięki @jamesw, ale obrazy nadal mają rozmiar 52. Czy to dlatego, że mam rozmiar ustawiony na 52 wyraźnie w częściowej?
dopplesoldner
1
Tak, właściwie nadpisujesz poprzednią wartość rozmiaru.
Akshay Vishnoi
3
Możesz pominąć localshash, aby użyć krótkiej wersji w następujący sposób:<%= render @users, size: 30 %>
Pedro Adame Vergara
177

Z interfejsu Rails w PartialRender :

Renderowanie domyślnego przypadku

Jeśli nie zamierzasz używać żadnej z opcji, takich jak kolekcje lub układy, możesz również użyć domyślnych ustawień krótkiej ręki do renderowania częściowych.

Przykłady:

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

Możesz więc użyć przekazywania zmiennej lokalnej, sizeaby renderować w następujący sposób:

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

a następnie użyj go w _user.html.erbczęściowej:

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

Zauważ, że size: sizejest to równoważne z :size => size.

Karim Sonbol
źródło
14
Drugi render, ten bez miejscowych, uratował mi życie. Dzięki
cassioscabral
6

Zarówno

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

Lub

render 'user', size: 30

Aby użyć locals, potrzebujesz partial. Bez partialargumentu możesz po prostu wyświetlić zmienne bezpośrednio (nie w obrębie locals)

Lustro318
źródło
5

Nie używaj localsw Railsach 4.2+

W Railsach 4.2 musiałem usunąć localsczęść i po prostu użyć size: 30. W przeciwnym razie nie przekaże poprawnie zmiennej lokalnej.

Na przykład użyj tego:

<%= render @users, size: 30 %>
Joshua Pinter
źródło
3

Jeśli używasz JavaScript do renderowania, użyj escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");

Apoorv
źródło
1

Trochę inaczej składniowo, ale moim zdaniem wygląda czyściej:

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
źródło
1

Możesz tworzyć zmienne lokalne po wywołaniu funkcji renderowania częściowej, dlatego jeśli chcesz dostosować część podrzędną, możesz na przykład renderować częściową _form.html.erbprzez:

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

w ten sposób możesz uzyskać dostęp częściowo do etykiety przycisku i adresu URL, są one różne, jeśli spróbujesz utworzyć lub zaktualizować rekord. na koniec, aby uzyskać dostęp do tych zmiennych lokalnych, musisz umieścić w swoim kodzie 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
źródło