将每个实体放在一个文件中

grape each entity in a single file

我想在葡萄实体文件里面有多个类,这是文件夹结构app/api/proj/api/v2/entities/committees.rb

module PROJ::API::V2::Entities
class Committee < Grape::Entity
expose :id

expose :name, :full_name, :email, :tag, :parent_id

expose :country do |entity, option|
  entity.parent.name if entity.parent.present?
end

# include Urls

private
  def self.namespace_path
    "committees"
  end
end

  class CommitteeWithSubcommittees < CommitteeBase
        # include ProfilePhoto 
        expose :suboffices, with: 'PROJ::API::V2::Entities::CommitteeBase'
      end

葡萄里面API

present @committees, with: PROJ::API::V2::Entities::Committee

正在工作。但如果我提出

present @committees, with: PROJ::API::V2::Entities::CommitteeList

它不起作用。但是当我将它移动到实体中名为 committee_list.rb 的新文件时它会起作用。

您的 post 似乎遗漏了一些关键信息,因为您没有在任何地方定义名为 CommitteeListCommitteeBase 的 class。我假设您已经定义了它们并且您没有提供该代码。

您 运行 遇到的问题与 Rails 自动加载 class 的方式有关。这里有 more information available elsewhere,但本质上你应该确保你的 class 名称、模块名称、目录名称和文件名称都匹配。当您将 CommitteeList class 移动到它自己的文件时它起作用的原因是因为 Rails 能够动态地找到 class。

我不得不根据您提供的内容进行一些猜测,但您想要的内容如下所示:

# app/api/proj/api/v2/entities/committee.rb
module PROJ::API::V2::Entities
  class Committee < Grape::Entity; end
end

# app/api/proj/api/v2/entities/committee_base.rb
module PROJ::API::V2::Entities
  class CommitteeBase; end
end

# app/api/proj/api/v2/entities/committee_with_subcommittee.rb
module PROJ::API::V2::Entities
  class CommitteeWithSubcommittee < CommitteeBase; end
end

# app/api/proj/api/v2/entities/committee_list.rb
module PROJ::API::V2::Entities
  class CommitteeList < CommitteeBase; end
end

请注意,在这个例子中我重命名了一些东西;您的 class 名称应该是单数(committee 而不是 committees)并且文件名应该与它们相匹配,但是进行更改可能会导致您的应用出现其他问题。通常,you should use singular 而不是复数。

我建议阅读 the Rails guide entry on constants and autoloading 了解更多详情。

更新:

在您的要点中,您说当您使用以下代码 运行 present @committees, with: PROJ::API::V2::Entities::CommitteeOffice 时,您会得到 Uninitialized constant PROJ::API::V2::Entities::CommitteeOffice

# app/api/proj/api/v2/entities/committee_base.rb
module PROJ::API::V2::Entities
  class CommitteeBase < Grape::Entity; 
    expose :id
  end
  class CommitteeOffice < CommitteeBase; 
    expose :name
  end
end

您收到此错误是因为 Rails 将仅在文件 entities/committee_base.rb 中查找名为 PROJ::API::V2::Entities::CommitteeBase 的 class。如果您更喜欢为实体 classes 使用单个整体文件,则必须将上述文件命名为 app/api/proj/api/v2/entities.rb.

通过命名文件app/api/proj/api/v2/entities.rb,它告诉Rails "This file contains the module Entities and all its classes."