2014-09-05 86 views
16

TL; DR: Microdata强制您使用itemprop作为此itemprops值的itemtype。如果你想把你的模板分解成部分,你如何处理这个问题?该元素可能只出现在两个地方之一中,无论是在包含模板中还是在包含的部分中,这两者都不能很好地工作。Microdata:如何使用模板/部分?

我正在使用haml的Rails,但我想我的问题适用于任何模板引擎,您可以将模板分割成更小的部分。我大量使用partials,这意味着我的模板通常不会超过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 

然后呢?我必须在同一个div上添加VideoObject itemtype,它具有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' ] 

但是itemtype属于视频。我不想在每一个容器元素中重复它。我希望能够在其他地方使用部分视频,并且仍然会将其视为具有微数据的视频。所以,整个事情已经搬出物品的部分,进入VIDO部分是这样的:

#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传递给partial。这也意味着,如果没有传递,我们必须声明一个默认的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的名称传递到partial中会让人感到困惑,因此partial会知道itemprop被调用的是它的值。这有多奇怪?在编程的其他地方,我遇到了需要知道指向它们的事物名称的对象。

那么有没有更好的方法来做到这一点?或者,这是怎么回事,我不应该这么唠叨呢? ☺

+3

支持这样一个雄辩的问题! – 2014-09-05 09:32:07

+0

@RichPeck是的,在完成后我想,这应该是一个博客文章,而不是。但是再一次,我没有博客,所以,呃。 ;) – Conkerchen 2014-09-05 09:36:49

+2

唯一的问题是像我这样的人想看到一个简短的问题来回答:D需要大量的脑力来制定答案,而不必解决原始问题。你可以加一个旁边给我们一个更简洁的问题吗? – 2014-09-05 09:39:55

回答

0

我认为你对将div-business放入局部区域犹豫不决,因为它在语义上并不属于那里,如果你想在没有div的情况下将视频渲染到其他地方,那么你遇到了麻烦。

所以这是我建议:

  1. 你可以看看包裹的视频对象(我想这是某种模式)转换成装饰和渲染在div企业那里。

  2. 你甚至可以使一个普通的微观数据-DIV-部分,这可能去约,如:

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

这可能是语法太可怕了,很抱歉。

  1. 然后,您可以渲染出装饰器方法中的div,并独立于您的视频在其自身部分中的渲染方式。

所以其基本上是: [控制器]

@video.decorate 

- > [查看]:

@video.render_with_micro 

- > [装饰]:使微数据-DIV-局部用@视频作为项目和给定的itemprops,itemtypes - > Itemprops,Itemtypes正在装饰器内维护(这是他们所属的地方国际海事组织,他们是代表信息)。

我希望我的考题帮助, 干杯!

2

不得不阅读它几次才能得到问题的要点。这是一个很好的问题!

TL; DR:是的,你有点婊子,但是很好!使用装饰器或单元格可以让感觉更好,但不幸的是总会需要一种方式让两个范围相互作用,而父范围则影响嵌入范围。看看你的问题,它似乎主要是基于一个在其他编程领域也很常见的问题,它在计算中引起了很多讨论和不满(例如参见JavaScript范围)。我正在谈论物体的范围。在这种情况下,我们正在讨论两个元素的范围,当嵌入到父元素中时,必须有不同的行为。

在您的问题的实际水平上;你是对的,部分应该有责任为对象提供itemscope和itemtype。这从对象的角度来看对我来说最为合理,并且与文章的顶层元素保持一致。我会以这种方式来看待它。在这种情况下,这是最一致的。

对于在嵌入时在元素中提供itemprop的解决方案;如果从渲染的地方传递它似乎是最符合逻辑的,那么你就是解决方案。我同意这不看“红宝石的方式”,所以我建议的确看看decoratorscells。这两个都可以帮助你清理你的观点/偏见。看起来你已经进入了部分方法,单元可以为视图内的控制器提供一个额外的层。有时非常有用。

我喜欢@jfornoff的建议,即创建更通用的解决方案,您还可以将其用于除视频之外的项目。还有solutions out there for microformats。微格式助手和Html模式似乎都试图帮助你这样做,尽管两者都需要一些新的贡献。

相关问题