Как вы передаете локальные переменные в content_tag или content_for?
На мой взгляд, у меня есть content_tag
это выглядит так:
<% content_tag :div do %>
<h1><%= title %></h1>
<p><%= description %></p>
... # a bunch of other stuff
<% end %>
Я хотел бы использовать это content_tag
несколько раз для создания "разделов" на странице, каждый раз передавая разные title
а также description
к этому. Тем не менее, я не хочу идти и делать частичное, что кажется излишним. Я хочу, чтобы все содержалось в одном файле просмотра. Как мне это сделать?
1 ответ
Назначение content_tag
Переменная (и последующая печать переменной) кажется немного запутанной, тем более что нет хорошего способа передать ей свою коллекцию продуктов.
СУХОЙ способ сделать это - перебрать свой список продуктов и передать каждый из них вашему content_tag
:
<% products.each do |product| %>
<%= content_tag :div, :class => "product-info" do %>
<h1><%= product.name %></h1>
<p><%= product.description %></p>
<% end %>
<% end %>
В качестве альтернативы вы можете абстрагировать эту логику в помощник вида, который эффективно дает тот же результат:
def product_info_div(products)
products.each do |product| %>
content_tag :div, :class => "product-info" do %>
content_tag :div, product.name
content_tag :p, product.description
end
end
end
По вашему мнению, вы бы вызвали это следующим образом:
<%= product_info_div(@products) %>
Хотя это не частичное, это другой файл. Тем не менее, это именно то, что должны делать помощники вида. Любой из вариантов сделает ваш код СУХИМЫМ и читаемым, выполняя точно то, что вы хотите, IMO.
РЕДАКТИРОВАТЬ:
Вам не нужно явно передавать локальные переменные, чтобы использовать их в content_tag
- они доступны для использования в content_tag
как они были бы вне этого.
Хотя я не уверен, как вы получаете title
а также description
Чтобы измениться, вы можете сделать параллельное назначение непосредственно перед content_tag
декларация, в которой вы присваиваете значения title
а также description
локальные переменные:
<% title, description = 'title_1', 'description_1' %>
<%= content_tag :div do %>
<h1><%= title %></h1>
<p><%= description %></p>
# a bunch of other stuff
<% end %>
<% title, description = 'title_2', 'description_2' %>
<%= content_tag :div do %>
<h1><%= title %></h1>
<p><%= description %></p>
# a bunch of other stuff
<% end %>
Обратите внимание, что вам нужно вывести content_tag
с помощью <%= %>
, Rails ничего не может сделать с интерпретированным content_tag
если это не выводится.