Я видел странное поведение при использовании рельсов с частичной разметкой плюс вспомогательный метод, закодированный как итератор с использованием ключевого слова yield.Я надеюсь, что кто-то может:
- Объяснить, что происходит и почему я получаю дублированный рендеринг и, возможно,
- Предложить альтернативный подход, надеюсь, отличный от простого перекодирования моего вспомогательного метода вбыть простой функцией, которая возвращает список (я уже сделал это как временное решение)
Так что, если я создаю следующие 3 вещи в моем приложении rails 3, я получаю неожиданный вывод.
[ОБНОВЛЕНИЕ] Я проверил следующие комбинации:
Rails 3.0.0 + erb (has this issue)
Rails 3.0.0 + haml (OK)
Rails 3.0.3 + erb (has this issue)
Rails 3.0.3 + haml (OK)
Так что, возможно, это вещь эрб против хамла, но когда я впервые обнаружил это, это было на шаблонах хамла.Хммм .... кто-нибудь знает, что происходит ???
A) Основной шаблон, который выглядит следующим образом (app / views / main / index.html.erb)
<h1>Main#index</h1>
<p>This is content from main#index before the partial template rendering
<%= render :partial => "partial" %>
<p>This is content from main#index after the partial template rendering.</p>
B) Вспомогательный метод, подобный этому (app / helpers / main_helper.rb)
module MainHelper
def my_iterator
yield 1
yield 2
yield 3
yield 4
end
end
C) Частичный шаблон, подобный этому (app / views / main / _partial.html.erb)
<% my_iterator do |x| %>
<p>iterator running with <%= x %></p>
<% end %>
Когда я просматриваю результат в браузере, я вижу блок «Итератор работает с» в общей сложности 8 раз (1 2 3 4 1 2 3 4).Я определил, что это доходность в завинчивании my_iterator с механизмом частичного шаблона рельсов.Если я кодирую my_iterator следующим образом, вывод будет таким, как я ожидал.(Мне также нужно изменить мой частичный шаблон, чтобы он выполнял my_iterator.each)
def my_iterator
logger.debug("my_iterator called")
return [1, 2, 3, 4]
end
Есть ли способ кодировать это так, чтобы я не испортил рельсы и не получил дублированный рендеринг, но все еще мог кодировать помощникаметод в качестве итератора с использованием yield?Кроме того, кто-то может объяснить, как именно происходит дублирование рендеринга?