Rails 4 - передача переменной частичной
Я следую учебнику Ruby on Rails и сталкиваюсь с проблемой при попытке передать переменные в частичные.
Мой _user
частичный выглядит следующим образом
<li>
<%= gravatar_for user, size: 52 %>
<%= link_to user.name, user %>
</li>
Я хотел бы передать число для значения размера. Я стараюсь сделать это без везения.
<%= render @users, :locals => {:size => 30} %>
Спасибо заранее!
Ответы
Ответ 1
Вам нужен полный синтаксис частичного рендеринга, если вы передаете локальные
<%= render @users, :locals => {:size => 30} %>
становится
<%= render :partial => 'users', :collection => @users, :locals => {:size => 30} %>
Или использовать новый синтаксис хэша
<%= render partial: 'users', collection: @users, locals: {size: 30} %>
Что я считаю гораздо более удобочитаемым
Ответ 2
Из Rails api на 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 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
.
Ответ 3
Либо
render partial: 'user', locals: {size: 30}
Или
render 'user', size: 30
Чтобы использовать locals
, вам нужен partial
. Без аргумента partial
вы можете просто перечислить переменные напрямую (не в locals
)
Ответ 4
Если вы используете JavaScript для рендеринга, используйте escape_JavaScript("<%=render partial: partial_name, locals=>{@newval=>@oldval}%>");
Ответ 5
Не используйте locals
в Rails 4. 2+
В Rails 4.2 мне пришлось удалить часть locals
и просто использовать вместо нее size: 30
. В противном случае он не будет правильно передавать локальную переменную.
Например, используйте это:
<%= render @users, size: 30 %>
Ответ 6
Синтаксически немного отличается, но на мой взгляд он выглядит более чистым:
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" }
Ответ 7
Вы можете создавать локальные переменные после вызова функции рендеринга для партиала, поэтому, если вы хотите настроить партиал, вы можете, например, визуализировать партиал _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%>