Варианты использования для различных помощников Padrino haml

Я читаю http://www.padrinorb.com/guides/application-helpers но мне неясно, какие варианты использования для каждого из помощников просмотра. В частности, как content_for/yield_content, render/partial, capture_html, and concat_content все подходят друг другу?

прямо сейчас я использую render 'my/view' в моих контроллерах и бросая некоторые =partial 'my/partial' внутри 'my/view' просто разорвать основной файл шаблона на более мелкие куски.

правильно ли это сделать? И когда/где я хочу использовать другого помощника функции?

1 ответов


давайте рассмотрим варианты использования.

  1. content_for / yield_content

Это для ввода содержимого в файл макета, который может быть полезен. Пример-добавление дополнительных css / скриптов в макет из другого шаблона. Пример в руководстве тот же, показывая, как добавить CSS-файлы в макет из любого шаблона, который требует их. Вы можете также использовать его для добавления контента на боковые панели, дополнительные ссылки и т. д. Это за то, что не требуется собственный шаблон, но необходимо передать информацию обратно в макет на основе отображаемого представления.

  1. render/partial

render предназначен для отображения заданного шаблона, связанного с маршрутом. рендеринг должен использоваться для основных действий после обработки маршрута. partial-это как "метод" в представлении. Его можно использовать повторно, и переменные могут быть переданы для изменения вывода. Частичные элементы в основных шаблонах используются для разбиения кода и повторного использования фрагментов представлений, которые иначе это может показаться излишним.

  1. capture_html / concat_content

это обычно используется для создания собственных помощников, которые принимают блоки контента. Например, давайте создадим помощник, который берет блок haml и обертывает его в div. Использование следующим образом:

# template.haml
# NOTE the equals so the content is returned 
# and added to the view directly
= div_wrapper do 
  %h1 Some heading
  %p This is now wrapped in a div

чтобы реализовать это и использовать его в шаблоне, вам нужно иметь возможность "захватить" haml, переданный в блок, чтобы обработать, а затем обернуть div вокруг него. Вот где capture_html поставляется в:

def div_wrapper(&block)
   nested_content = capture_html(&block)
   content_tag(:div, nested_content)
end

Это возьмет контент и выплюнет его в вид, завернутый в div. Теперь давайте предположим, что мы хотим, чтобы этот помощник был более сложным, и поэтому вы хотите, чтобы использование было больше похоже на это:

# template.haml
# NOTE the dash so the content is not outputted directly
- div_wrapper do 
  %h1 Some heading
  %p This is now wrapped in a div

но он также работает в других помощниках:

# some_helper.rb
def example(name)
  div_wrapper { "<h1>Test</h1>" }
end

чтобы правильно распечатать завернутый контент из помощника как в шаблоне, так и в прямом ruby, мы можем использовать concat_content и проверить, нужно ли нам "конкат" результат в шаблон или просто верните его.

 def div_wrapper(&block)
   nested_content = capture_html(&block)
   tag_result = content_tag(:div, nested_content)
   block_is_template?(block) ? concat_content(tag_result) : tag_result
end

Я надеюсь, что это работает в общих чертах. Функции могут перекрываться, но обычно становится ясно, когда использовать, основываясь на конкретном контексте.