【发布时间】:2014-09-05 06:55:34
【问题描述】:
TL;DR: 微数据强制您在与作为该 itemprops 值的 itemtype 相同的元素上使用 itemprop。如果您想将模板分解为部分,您将如何处理?元素可能只出现在两个地方之一,要么在包含模板中,要么在包含的部分中,这两者都不能很好地工作。
我正在使用带有 haml 的 Rails,但我想我的问题适用于任何模板引擎,您可以在其中将模板拆分为更小的部分。我大量使用部分,这意味着我的模板通常不超过 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 必须与视频 itemtype 位于同一元素上。但是为什么视频要偏心/知道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 的名称是它的值。这有多奇怪?在编程中,我从未遇到过需要知道指向它们的事物名称的对象。
那么有没有更好的方法来做到这一点?还是事情就是这样,我不应该对它如此抱怨? ☺
【问题讨论】:
-
支持这样一个雄辩的问题!
-
@RichPeck 是的,完成后我想,这应该是一篇博文。但是话又说回来,我没有博客,所以,嗯。 ;)
-
唯一的问题是像我这样的人希望看到一个快速的问题来回答 :D 想出一个答案需要大量的脑力,而不必解决原来的问题。您能否补充一句,给我们一个更简洁的问题?
-
@RichPeck 将 TL;DR 放在顶部。希望对您有所帮助。
-
为什么不创建一个道具模型,然后你就可以做一个
@article.prop.name和@article.prop.url(或架构)例如
标签: ruby-on-rails haml microdata