11

我想使用 json ld 设置 schema.org 元数据。例如,以下链接使用 ghost 并且它具有“application/ld+json”元数据。 http://blog.ghost.org/distributed-team-tools/

我想为我的 rails 应用程序实现类似的目标。我应该如何实现它。是否有一些宝石可以做到这一点等。

谢谢!

4

2 回答 2

11

有一个 JSON-LD gem ( http://rubygems.org/gems/json-ld ),但它可能不是您想要的。请注意,JSON-LD 的重点在于它只是 JSON,在这种情况下使用 schema.org 上下文来解释值。假设您的数据在 ActiveRecord 模型中,您需要一种方法来确保记录属性对应于适当的 schema.org 属性。如果是这种情况,那么只需将您的模型序列化为 JSON (#to_json) 即可完成大部分工作。剩下的是将@context@id@type字段添加到 JSON。

例如,假设您有一个序列化为如下内容的 User 模型:

{
  "name": "Harry",
  "email": "Harry@example.org"
}

作为http://schema.org/Person的 "name" 和 "email" 属性,您可以通过简单地添加 a@context@type如下所示:

{
  "@context": "http://schema.org/",
  "@type": "Person",
  "name": "Harry",
  "email": "Harry@example.org"
}

假设您正在构建一个 RESTful 应用程序,最好给每个对象一个@id,它对应于此人的资源 URL。这可能如下所示:

{
  "@context": "http://schema.org/",
  "@id": "http://example.com/people/harry",
  "@type": "Person",
  "name": "Harry",
  "email": "Harry@example.org"
}

现在,如果您将http://example.com/people/harry检索为 JSON(或 JSON-LD),则可以取回该表示。

JSON-LD 的另一件事是它用于“链接数据”,因此包括对其他资源的引用对于允许找到它们很有用,就像您在 HTML 中所做的那样。schema.org 文档包含大量示例,说明如何为它们定义的大多数类型生成不同类型的标记,包括 JSON-LD。有关示例,请参阅http://schema.org/Person,或有关其完整类型层次结构的http://schema.org/docs/full.html 。

当您想要从其他来源(通常是某种 RDF 格式)生成此数据或解释您收到的数据时,JSON-LD gem 会派上用场。您可以在http://json-ld.org/playground对此进行试验。

您还可以像您的示例一样使用 type="application/ld+json" 的脚本标记将 JSON-LD 包含在 HTML 中。如果您想查看数据的外观,可以在 Google 结构化数据测试工具或http://linter.structured-data.org/上对其进行测试

于 2014-12-31T20:43:07.623 回答
1
%script{type: "application/ld+json"}
 :plain
  {
    "@context": "http://schema.org",        
    "headline": "Headline",       
    "@type": "Article",
    "alternativeHeadline": "Alternative Headline}"
  }

我没有使用:javascript过滤器http://haml.info/docs/yardoc/file.REFERENCE.html#filters,而是使用了%script允许我type通过使用将attribute method类型定义为application/ld+jsonhttp :// haml.info/docs/yardoc/file.REFERENCE.html#attribute-methods

过滤器:plain,它不解析过滤后的文本。这对于没有 HTML 标记的大块文本很有用,当您不想要以 . 或 - 要解析,请参阅文档http://haml.info/docs/yardoc/file.REFERENCE.html#plain-filter

于 2019-06-22T16:32:22.810 回答