微数据:如何使用模板/部分?

Con*_*hen 16 haml ruby-on-rails microdata

TL; DR: Microdata强制您在与此itemprops vaule的itemtype相同的元素上使用itemprop.如果你想将你的模板分解为部分,你如何处理这个问题?元素可能只出现在两个位置中的一个位置,无论是在包含模板还是包含的部分中,两者都不能很好地工作.

我正在使用带有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 }
Run Code Online (Sandbox Code Playgroud)

现在使用微数据:

#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
Run Code Online (Sandbox Code Playgroud)

然后什么?我必须VideoObject在同一个div上添加itemtype,itemprop: 'video'因为这就是微数据的工作方式.所以:

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

但是,我不能再在视频部分中使用相同的itemtype.现在这将是无效的:

#app/views/videos/_video.html.haml
%div[ video, itemscope: true, itemtype: 'http://schema.org/VideoObject' ]
Run Code Online (Sandbox Code Playgroud)

但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' } 
Run Code Online (Sandbox Code Playgroud)

同样,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' } 
Run Code Online (Sandbox Code Playgroud)

这看起来过于复杂.我发现将itemprop的名称传递给partial也很困惑,因此partial知道itemprop被调用的是什么值.这有多奇怪?在编程中没有其他地方我遇到了需要知道指向它们的东西的名称的对象.

那么有更好的方法来做到这一点吗?或者就是这样,我不应该对它如此痴迷?☺

jfo*_*off 0

我认为你对将 div 业务放入部分犹豫不决是正确的,因为它在语义上不属于那里,并且如果你想在没有 div 的其他地方渲染视频,你就会遇到麻烦。

所以这就是我的建议:

  1. 您可以考虑将视频对象(我想它是某种模型)包装到装饰器中并在那里渲染 div 业务。

  2. 你甚至可以制作一个通用的 microdata-div-partial,它可能是这样的:

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

抱歉,这在语法上可能很糟糕。

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

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

@video.decorate
Run Code Online (Sandbox Code Playgroud)

-> [查看]:

@video.render_with_micro
Run Code Online (Sandbox Code Playgroud)

-> [Decorator]:使用 @video 作为项目渲染 microdata-div-partial,并且给定的 itemprops、itemtypes -> Itemprops、Itemtypes 正在装饰器中维护(在我看来,这是它们所属的位置,它们是表示信息)。

我希望我的大脑转储有帮助,干杯!