Рейки 4 - перехідна змінна в часткова


125

Я стежу за підручником Ruby on Rails і зіткнувся з проблемою, намагаючись передати змінні партії.

Моя _userчасткова така

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

Я хотів би передати число для значення розміру. Я намагаюся так, без жодної удачі.

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

Відповіді:


162

Вам потрібен повний частковий синтаксис візуалізації, якщо ви передаєте місцеві жителі

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

Стає

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

Або використовувати новий синтаксис хешу

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

Я вважаю, що це набагато читабельніше


Дякую @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
Другий рендер, той без місцевих жителів, врятував мені життя. Спасибі
кассіоскабрал

6

Або

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

Або

render 'user', size: 30

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


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}%>");


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%>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.