【问题标题】:Document model attributes with YARD使用 YARD 记录模型属性
【发布时间】:2026-02-22 23:45:02
【问题描述】:

我正在使用 YARD 为我的 rails 应用程序生成文档,并使用 makrdown 作为脚本解析器。大多数文档功能开箱即用。但是,我还想将模型属性记录为一个,记录模型上的可用属性列表,以及两个,以描述它们的语义。

我无法在 YARD 中找到任何对此的特殊支持,我基本上只需要列出类 cmets 中的属性。有没有办法记录动态生成的模型属性,以便它们像标准属性/方法一样出现在文档中?

附:我已经使用 annodate-models gem 在类列表的顶部生成一个基本模式转储,但这并不是我真正想要的。

【问题讨论】:

    标签: ruby documentation yard


    【解决方案1】:

    似乎 YARD 现在有自己的@!attribute(注意感叹号)标签用于此目的:

    http://rubydoc.info/docs/yard/file/docs/Tags.md#attribute

    例子:

    class Task < ActiveRecord::Base
      # @!attribute name
      #   @return [String] The name of the task.
    
      # @!attribute description
      #   @return [String] The description of the task.
    
      # @!attribute active
      #   @return [Boolean] Marks whether the task is active or not.
    end
    

    这将为您的属性提供很好的文档。唯一需要注意的是,您始终保持文档是最新的,因为当您从数据库中删除某个属性等时,没有人会检查您是否从文档中删除了该属性。

    【讨论】:

    • 这是我使用的解决方案,但它的问题是 YARD 将 Task#name=Task#description=Task#active= 显示为未记录,所以我不知道如何将我的文档恢复到100%。
    • 我最终只是为二传手复制了文档。有更好的解决方案吗? @!attribute description=
    【解决方案2】:

    经过一段时间的搜索,我将属性的文档手动添加到模型文件中。这当然不理想,但希望模型结构不会发生太大变化。

    我为项目创建了一个 .yardopts 文件,并使用 yard 命令行选项创建了两个新标签来标记它们:

    --type-name-tag 'attribute:Attributes' --type-name-tag 'association:Associations'
    

    这些为我提供了用于标记属性和关联的特定标签;它们将分组显示在文档中的“属性”和“关联”标题下。我可以添加这个:

    # @attribute name [String] The name of the object
    # @association relatedObjs [Array<AnotherClass>] Objects needed to perform a certain function
    

    也许有人会为 YARD 编写一个插件来解析 annotate-models 输出。

    【讨论】:

    • 这看起来很有希望。我已经分叉了 annotae-models gem 以添加其他格式。这可能只是要走的路。能否在 github 存储库中包含完整的命令行和 .yardopts 文件?
    • 是的!只需将您将使用的所有命令行选项放入项目根目录中的 .yardopts 文件中即可。然后你所要做的就是从你的项目根目录运行yardoc。我很想看看你从注释模型代码中得到了什么。有人拥有一个有趣的分支,可以从 MySQL 表中提取 cmets 以及其他列信息。这可能会更容易。
    • 这看起来很有希望,但似乎 YARD 忽略了 [Type]?!你有没有想出任何其他的解决方案?这对您来说效果如何?
    • 我找到了更好的解决方案,请参阅下面的答案。