【问题标题】:Microdata: How to use with templates/partials?微数据:如何与模板/部分一起使用?
【发布时间】: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


【解决方案1】:

必须阅读几次才能了解问题的要点。这是一个很好的问题!

TL;DR: 是的,你有点讨厌,但说得对!使用装饰器或单元格使其看起来感觉更好,但不幸的是,总是需要一种方法让两个作用域进行交互,并让父作用域影响嵌入的作用域。

长读:看看你的问题,它似乎主要是基于在其他编程领域也很常见的问题,它在计算领域引起了很多讨论和不满(请参阅 JavaScript scopes for例子)。我说的是对象的范围。在这种情况下,我们讨论的是两个元素的作用域,其中一个元素在嵌入父元素时必须表现不同。

在实际问题上;你是对的,partial 应该有责任为对象提供 itemscope 和 itemtype。从对象的角度来看,这对我来说最有意义,并且与文章的顶级元素一致。我会以这种方式看待它。在这种情况下,这是您可以获得的最一致的结果。

用于在嵌入时在该元素中提供 itemprop 的解决方案;如果从它呈现的地方传递它看起来最合乎逻辑,那么你就是解决方案。我同意这看起来不像“红宝石方式”,所以我建议确实看看decoratorscells。这两个都可以帮助你清理你的视图/部分。看起来您正在使用部分方法单元,可以在视图中为您提供额外的控制器层。有时非常有用。

我喜欢 @jfornoff 的建议,即您创建更通用的解决方案,您也可以将其用于视频以外的项目。还有solutions out there for microformats。微格式助手和 Html-schema 似乎都在尝试帮助您实现这一目标,尽管它们似乎都需要一些新的贡献。

【讨论】:

    【解决方案2】:

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

    这就是我的建议:

    1. 您可以考虑将 Video-Object(我想它是某种模型)包装到装饰器中并在那里渲染 div-business。

    2. 您甚至可以创建一个通用的 microdata-div-partial,它可能类似于:

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

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

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

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

    @video.decorate
    

    -> [查看]:

    @video.render_with_micro
    

    -> [装饰器]:使用@video作为项目和给定的项目道具,项目类型呈现微数据div部分 -> Itemprops,Itemtypes 在装饰器中维护(它们属于 IMO,它们是表示信息)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 2016-05-17
      • 2019-12-28
      • 2021-05-23
      • 2017-07-04
      • 2012-05-30
      • 1970-01-01
      相关资源
      最近更新 更多