Как вы передаете локальные переменные в 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 если это не выводится.

Другие вопросы по тегам