Микроданные: как использовать шаблоны/частичные?

TL; DR:. Микроданные заставляют вас использовать элемент itemprop в том же элементе, что и элемент itemtype, который является элементом itemprops vaule. Как вы справляетесь с этим, если хотите разбить свой шаблон на частичные? Элемент может отображаться только в одном из двух мест, либо в содержащем шаблоне, либо в частичном части, оба из которых не очень хорошо работают.

Я использую Rails с haml, но, я думаю, мой вопрос относится к любому движку шаблонов, где вы можете разделить свой шаблон на меньшие частичные. Я сильно использую частичные, это означает, что мои шаблоны обычно не более 10 строк кода. Но установка микроданных в них кажется чрезмерно сложной, так как вы должны правильно использовать микроданные с частичными?

Возьмем этот пример:

#app/views/article/show.html.haml
%p Hey, Welcome! Read This wonderful article:
= render @article

#app/views/articles/_article.html.haml
%div[ article ]
  %h1= @article.title
  %p= @article.description
  %div= render @article.video

#app/views/videos/_video.html.haml
%div[ video ]
  %h2= video.file_name
  %video{ src: video.url }

И теперь с микроданными:

#app/views/articles/_article.html.haml
%div[ article ]{ itemscope: true, itemtype: 'http://schema.org/Article' }
  %h1{ itemprop: 'name' }= @article.title
  %p{ itemprop: 'description' }= @article.description
  %div{ itemprop: 'video' }= render @article.video

И что тогда? Я должен добавить элемент VideoObject itemtype в том же div, который имеет itemprop: 'video', потому что, как работают микроданные. Итак:

#app/views/articles/_article.html.haml
%div{ itemprop: 'video', itemscope: true, itemtype: 'http://schema.org/VideoObject' }= render @article.video

Но тогда я не могу снова использовать тот же элемент itemtype в частичном видео. Теперь это будет недействительным:

#app/views/videos/_video.html.haml
%div[ video, itemscope: true, itemtype: 'http://schema.org/VideoObject' ]

Но элемент item принадлежит видео. Я не хочу повторять это в каждом контейнере. Я хочу, чтобы иметь возможность использовать видео частица везде, и все еще его объявили как видео с микроданными. Таким образом, все это должно перейти из частичной части статьи и частичного части VID:

#app/views/articles/_article.html.haml
%div= render @article.video

#app/views/videos/_video.html.haml
%div[ video ]{ itemprop: 'video', itemscope: true, itemtype: 'http://schema.org/VideoObject' } 

Опять же, itemprop должен быть на том же элементе, что и тип элемента видео. Но почему для частичного ухода за видео/знать, как вызвано itemprop, что это значение?

Единственное решение, которое у меня есть, - передать itemprop в частичное. Это также означает, что мы должны объявить значение itemprop по умолчанию в случае, если никто не передан. Итак, мы закончили с этим:

#app/views/articles/_article.html.haml
%div= render @article.video, itemprop: 'video'

#app/views/videos/_video.html.haml
itemprop ||= nil
%div[ video ]{ itemprop: itemprop, itemscope: true, itemtype: 'http://schema.org/VideoObject' } 

Это кажется слишком сложным. Кроме того, мне кажется довольно запутанным передать имя элемента itemprop в частичное, поэтому частичный знает, что называется itemprop, что это значение. Как странно это? Нигде в программировании я не сталкивался с объектами, которые должны были знать имя того, что указывает на них.

Итак, есть ли лучший способ сделать это? Или так оно и есть, и я не должен был так скулить об этом? ☺

Ответы

Ответ 1

Пришлось прочитать пару раз, чтобы понять суть вопроса. И хороший вопрос!

TL; DR: Да, вы немного подкупаете, но с хорошим правом! Используйте либо Декораторы, либо Ячейки, чтобы заставить его выглядеть лучше, но, к сожалению, всегда нужно будет взаимодействовать с двумя областями, а родительский - воздействовать на встроенный.

Более длинное чтение:. Глядя на вашу проблему, она, по-видимому, в основном основана на проблеме, которая также распространена в других областях программирования, и это вызвало много обсуждений и жалоб в вычислениях (см. области JavaScript для пример). Я говорю о области объектов. В этом случае мы говорим о области видимости двух элементов, где нужно вести себя иначе, когда они встроены в родительский элемент.

На практическом уровне вашей проблемы; вы правы, что частичное должно нести ответственность за предоставление предметов и предметов для объекта. Это имеет для меня наибольший смысл с точки зрения объекта и соответствует элементу верхнего уровня статьи. Я бы подошел к этому, чтобы посмотреть на него. Это самое последовательное, что вы могли бы получить в этом случае.

Для решения вопроса о предоставлении itemprop в этом элементе при его вставке; Вы - решение, если передать его с того места, где оно отображается, представляется наиболее логичным. Я согласен, что это не выглядит "рубиновым", поэтому я бы предложил действительно посмотреть на декораторы или cells. Оба эти могут помочь вам очистить ваши взгляды/частичные много. Похоже, вы попадаете в частичный подход, клетки могут предложить вам дополнительный слой контроллеров внутри представления. Очень полезно иногда.

Мне нравится @jfornoff, что вы создаете более общее решение, которое вы также можете использовать для других предметов, кроме видео. Также есть решения для микроформатов. Как помощник микроформатов, так и схема Html кажутся вроде бы попыткой и помогут вам в этом, хотя оба они нуждаются в каких-то свежих вкладах. Кажется, что.

Ответ 2

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

Итак, вот что я хотел бы предложить:

  • Вы можете посмотреть на обертывание Video-Object (я полагаю, это какая-то модель) в декоратор и сделать там div-бизнес.

  • Вы даже можете создать общий микродатчик-div-partial, который, вероятно, будет выглядеть следующим образом:

%div [ your-item-type ] { itemprop: propvar, itemscope: true, itemtype: typevar } render item

Это, вероятно, синтаксически ужасно, извините.

  1. Затем вы можете просто визуализировать div в методе декоратора и быть независимым от того, как ваше видео отображается в его частичном.

Итак, в основном: [Контроллер]

@video.decorate

- > [View]:

@video.render_with_micro

- > [Decorator]: отображает микроданные-div-частичные с помощью @video как элемента и данные itemprops, itemtypes - > Itemprops, Itemtypes поддерживаются внутри декоратора (где они принадлежат IMO, они являются информацией о представлении).

Я надеюсь, что мой braindump поможет, Ура!