如何使用YARD过滤器检索班级上的标签?

时间:2012-06-18 18:30:54

标签: ruby-on-rails ruby yard

我对此很陌生,而且我一直在浏览YARD docs,并且无法找到解决问题的方法。

以下是我开始使用的代码:https://github.com/spape/yard-rest-plugin效果很好,但我正在尝试为其添加一些功能。

基本上,我正在尝试添加一个过滤器,以便我可以包含一些模型文档,以便查看Controller API文档的人可以看到他们可以使用的模型的属性。

插件,码头会过滤掉任何没有@resource标记的方法。所以,我想,我会为我的模型添加一个@resource_object标记,我希望在API文档中显示某些信息。

在插件的代码中。我在/lib/yard-rest.rb

中找到了
YARD::Templates::Template.extra_includes << RestFilters

在该文件中,我修改了reject_without_resource(list)方法

  def reject_without_resource(list)
    if list
      list.delete_if { |object| 
        if !object.is_a?(YARD::CodeObjects::ClassObject)
          true
        else
            !object.meths.detect{ |x| x.has_tag?(:resource) }# and 
          #  !object.detect{ |x| x.has_tag?(:resource_object) }
        end
      }
    end
  end
在我们关心的情况下,

对象是YARD::CodeObjects::ClassObjectobject.meths是一系列方法(Method Objects)。并且Method Objects有一个detect方法,它允许通过.has_tag?调用测试方法是否具有我们想要测试的任何标记。但是,我一直无法在班级找到类似的东西。现在,因为我不想在API Docs的模型中记录任何方法,所以我不想在任何模型方法上放置@resource标记。

我当前的.yardopts文件,以表明我确实正在搜索模型和控制器:

--title "My API Documentation"
--plugin rest
--readme API_README
app/models/*.rb
app/controllers/*.rb

那么,如何更改过滤器,以便我可以包含模型?或者至少是类级别的标签?

1 个答案:

答案 0 :(得分:0)

原来,你可以在对象上调用.has_tag。

如果你只是重新排列你的样子:

def reject_without_resource(list)
    if list
      list.delete_if { |object|
        if object.has_tag?(:resource_object)
          false
        elsif object.meths.detect{ |x| x.has_tag? (:resource) }
          false
        else
          true
        end
      }
    end
  end

它会起作用