2017-04-15 33 views
8

tek bir dosyada her varlık, bu klasör yapısı uygulaması/API/proj/API/v2/kuruluşlar/committees.rb olduğunuüzüm Ben üzüm varlık dosyası içine birden çok sınıfları istiyorum

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 

ve içeride Grape API'sı

çalışıyor. ama eğer

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

ile çalışıyorsa, çalışmıyor. Ama ben varlıklar içinde committee_list.rb adlı yeni bir dosyaya taşıdığımda çalışır.

cevap

5

Herhangi bir yerde CommitteeList veya CommitteeBase adında bir sınıf tanımlanmadığınız için yayınınızdaki bazı önemli bilgileri kaçırıyor görünüyorsunuz. Onları tanımladığınızı ve bu kodu sağlamadığınızı varsayalım.

Karşılaştığınız sorun, Rails sınıflarını otomatik olarak nasıl yüklediği ile ilgili. Bu konuda more informationavailable elsewhere var, ancak sınıf adlarınızın, modül adlarınızın, dizin adlarınızın ve dosya adlarınızın hepsinin eşleştiğinden emin olmalısınız. CommitteeList sınıfını kendi dosyasına taşıdığınızda çalışmasının nedeni, Rails sınıfı dinamik olarak bulabilmesidir.

Sağladığınız dayalı bazı tahmin işlerini yapmak zorunda kalmıştım ama şuna benzer bir şey istiyorum: Bu örnekte bazı şeyler değiştirildi ki

# 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 

Not; Sınıf adlarınız tekil (değil committees) olmalıdır ve dosya adları bunları eşleştirmelidir, ancak bu değişikliği uygulamanızda başka sorunlara neden olabilir. Genellikle you should use singular ve çoğul değil.

Daha fazla ayrıntı için the Rails guide entry on constants and autoloading okumanızı öneririz.

Güncelleme: Raylar yalnızca adlandırılmış sınıf için bakacağı için

# 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 

bu hatayı alıyorum: senin özünden olarak

Eğer aşağıdaki kodla present @committees, with: PROJ::API::V2::Entities::CommitteeOffice çalıştırdığınızda Uninitialized constant PROJ::API::V2::Entities::CommitteeOffice almak demek entities/committee_base.rb dosyada PROJ::API::V2::Entities::CommitteeBase. Varlık sınıflarınız için tek bir monolitik dosya kullanmayı tercih ederseniz, yukarıdaki dosyayı app/api/proj/api/v2/entities.rb olarak adlandırmanız gerekir.

app/api/proj/api/v2/entities.rb numaralı dosyaya ad vererek, "Bu dosya, Entities modülünü ve tüm sınıflarını içerir." dosya yapısı ile

+0

onun benim için iyi çalışıyor, ama ben böyle bir yapıya sahip olmadığını onun çalışmıyor https://gist.github.com/anbublacky/a6e66217b2fcdeb52fe580864beecf7f –

+0

güncellenen özü özünden dayalı –

+0

Güncelleme cevabı kontrol edin – anothermh

İlgili konular