2017-04-15 3 views
8

Je veux avoir plusieurs classes à l'intérieur de fichier d'entité de raisin, c'est la structure du dossier app/api/proj/api/v2/entités/committees.rbraisin chaque entité dans un seul fichier

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 

et à l'intérieur l'API Grape

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

fonctionne. mais si je présente avec

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

Cela ne fonctionne pas. Mais cela fonctionne quand je le déplace vers un nouveau fichier nommé committee_list.rb entités intérieures.

Répondre

5

Vous semblez manquer des informations clés de votre publication, car vous n'avez défini aucune classe nommée CommitteeList ou CommitteeBase. Je suppose que vous les avez définis et que vous n'avez pas fourni ce code.

Le problème que vous rencontrez concerne la façon dont Rails charge automatiquement les classes. Il y a more informationavailable elsewhere sur cela, mais vous devriez essentiellement vous assurer que vos noms de classe, noms de modules, noms de répertoires et noms de fichiers correspondent tous. La raison pour laquelle cela fonctionne lorsque vous déplacez votre classe CommitteeList dans son propre fichier est parce que Rails est capable de trouver la classe dynamiquement.

J'ai dû faire une conjecture basée sur ce que vous avez fourni, mais vous voulez quelque chose qui ressemble à ceci:

# 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 

Notez que dans cet exemple, je l'ai renommé certaines choses; vos noms de classe doivent être au singulier (committee et non committees) et les noms de fichiers doivent correspondre à eux, mais cette modification peut entraîner d'autres problèmes dans votre application. Généralement, you should use singular et non pluriel.

Je recommande de lire the Rails guide entry on constants and autoloading pour plus de détails.

Mise à jour:

Dans votre fond, vous dites que vous obtenez Uninitialized constant PROJ::API::V2::Entities::CommitteeOffice lorsque vous exécutez present @committees, with: PROJ::API::V2::Entities::CommitteeOffice avec le code suivant:

# 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 

Vous obtenez cette erreur, car Rails regardera seulement pour la classe nommée PROJ::API::V2::Entities::CommitteeBase dans le fichier entities/committee_base.rb. Si vous préférez utiliser un seul fichier monolithique pour vos classes d'entités, vous devez nommer le fichier ci-dessus app/api/proj/api/v2/entities.rb. En nommant le fichier app/api/proj/api/v2/entities.rb, il indique à Rails "Ce fichier contient le module Entities et toutes ses classes."

+0

Avec la structure de fichier son travail bien pour moi, mais si j'ai structure comme celle-son ne fonctionne pas https://gist.github.com/anbublacky/a6e66217b2fcdeb52fe580864beecf7f –

+0

essentiel mis à jour s'il vous plaît vérifier –

+0

réponse Mise à jour sur la base essentiel – anothermh