将每个实体放在一个文件中
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 似乎遗漏了一些关键信息,因为您没有在任何地方定义名为 CommitteeList
或 CommitteeBase
的 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."
我想在葡萄实体文件里面有多个类,这是文件夹结构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 似乎遗漏了一些关键信息,因为您没有在任何地方定义名为 CommitteeList
或 CommitteeBase
的 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."