Микроданные: как использовать шаблоны/частичные?
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
Это, вероятно, синтаксически ужасно, извините.
- Затем вы можете просто визуализировать div в методе декоратора и быть независимым от того, как ваше видео отображается в его частичном.
Итак, в основном:
[Контроллер]
@video.decorate
- > [View]:
@video.render_with_micro
- > [Decorator]: отображает микроданные-div-частичные с помощью @video как элемента и данные itemprops, itemtypes
- > Itemprops, Itemtypes поддерживаются внутри декоратора (где они принадлежат IMO, они являются информацией о представлении).
Я надеюсь, что мой braindump поможет,
Ура!