Варианты использования для различных помощников Padrino haml - PullRequest
6 голосов
/ 21 января 2011

Я прочитал 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 Ответ

12 голосов
/ 21 января 2011

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

  1. content_for / yield_content

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

рендер / частичный

рендер предназначен для отображения данного шаблона, связанного с маршрутом.рендер должен использоваться для основных действий после обработки маршрута.частичное похоже на «метод» в представлении.Его можно использовать повторно и передавать переменные для изменения вывода.Вы используете партиалы в основных шаблонах, чтобы разбить код и повторно использовать части представлений, которые в противном случае могли бы показаться излишними.

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

Чтобы реализовать это и использовать его в шаблоне, вам необходимо иметь возможность «захватить» хемл, переданный в блок, чтобы обработать и затем обернуть вокруг него 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

Чтобы правильно распечатать завернутый контент из помощника как в шаблоне, так и в прямом рубине, мы можем использовать 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

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

...