Rails 4 - передача переменной в частичную

125

Я слежу за учебником Ruby on Rails и столкнулся с проблемой при попытке передать переменные в партиалы.

Моя _userчасть выглядит следующим образом

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

Я хотел бы передать число в качестве значения размера. Я безуспешно пытаюсь сделать следующее.

<%= render @users, :locals => {:size => 30} %>
dopplesoldner
источник

Ответы:

162

Вам нужен полный синтаксис частичного рендеринга, если вы передаете локальные

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

становится

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

Или использовать новый синтаксис хеширования

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

Что, я думаю, намного читаемее

jamesc
источник
Спасибо @jamesw, но изображения все еще имеют размер 52. Это потому, что у меня явно установлен размер 52 в партиале?
dopplesoldner
1
Да, на самом деле вы отменяете предыдущее значение размера.
Акшай Вишной
3
Вы можете опустить localsхеш, чтобы использовать короткую версию, например:<%= render @users, size: 30 %>
Педро Адаме Вергара
177

Из API Rails на PartialRender :

Отображение случая по умолчанию

Если вы не собираетесь использовать какие-либо параметры, такие как коллекции или макеты, вы также можете использовать сокращенные значения по умолчанию для рендеринга для рендеринга частичных файлов.

Примеры:

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

Итак, вы можете передать локальную переменную sizeдля рендеринга следующим образом:

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

а затем используйте его в _user.html.erbчастичном:

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

Обратите внимание, что size: sizeэто эквивалентно :size => size.

Карим Сонбол
источник
14
Второй рендер, без местных, спас мне жизнь. Спасибо
cassioscabral 05
6

Либо

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

Или

render 'user', size: 30

Для использования localsвам понадобится partial. Без partialаргумента вы можете просто перечислить переменные напрямую (не внутри locals)

Mirror318
источник
5

Не использовать localsв Rails 4.2+

В Rails 4.2 мне пришлось удалить localsчасть и просто использовать size: 30. В противном случае он не смог бы правильно передать локальную переменную.

Например, используйте это:

<%= render @users, size: 30 %>
Джошуа Пинтер
источник
3

Если вы используете JavaScript для рендеринга, используйте escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");

Apoorv
источник
1

Синтаксически немного отличается, но, на мой взгляд, выглядит чище:

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

Вы можете создавать локальные переменные после вызова функции рендеринга в партиале, поэтому, если вы хотите настроить партиал, вы можете, например, отрендерить партиал _form.html.erb:

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

таким образом вы можете получить доступ в частичном виде к метке для кнопки и URL-адреса, они будут другими, если вы попытаетесь создать или обновить запись. наконец, для доступа к этим локальным переменным вы должны ввести свой код 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
источник