7

'u kullanarak etiketlenebilir olarak etkin etiketler için JSON'u silme hatası Bir Ruby 2/Rails 4 uygulamasında, bir JSON oluşturmak için active_model_serializers ile birlikte acts-as-etiketlenebilir eylemleri kullanmaya çalışıyorum Etiketleri diğer model parametreleriyle birlikte gönderen API.Active-model-serializers

İlk olarak bu sorun için bazı arka plan/motivasyon: JSON, bu yazının yazıldığı sırada JSON'daki katıştırılmış kayıtlar için desteği kaldırdığı ember/ember-data ile besleniyor. Bu konuda bir documentation düzeltmesi var, ama hantal buluyorum ve aslında işe yaramadı. Ben bir Ember acemi olduğumdan ve Rails ile biraz daha rahat olduğumdan, sorunu başka bir şekilde çözmeye çalışacağım, bu da belge kaydının yanında etiket kaydını kaldırarak. Bu çözümü daha çok beğendim çünkü bu benim uygulamam için daha anlamlı geliyor, ancak bunu da işe yaratamıyorum.

İşte bir örnek: ı kullanan bir belge modeli var diyelim eylemler-olarak-taggable-on: Bir etiketiyle bir belge ile veritabanını kurdum

class Document < ActiveRecord::Base 
    acts_as_taggable 
    # other code omitted 

. Şimdi aşağıdaki durumlarda göz önünde:

1. Tam Nesne yerleştir: Aşağıdaki serileştiriciye olarak:

class DocumentSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :tags 

Benim JSON (Raylar 4 UUIDs kullanarak) aşağıdaki biçimdedir:

{ 
    "documents": [ 
    { 
     "id": "c41460fa-2427-11e3-8702-0800270f33f4", 
     "tags": [ 
     { 
      "id": "a33fc396-2428-11e3-8eeb-0800270f33f4", 
      "name": "test" 
     } 
     ] 
    } 
    ] 
} 

2. Kimlik Embed: Serileştiriciyi kullanma

Benim JSON şimdi benziyor:

{ 
    "documents": [ 
    { 
     "id": "c41460fa-2427-11e3-8702-0800270f33f4", 
     "tag_ids": [ 
     "a33fc396-2428-11e3-8eeb-0800270f33f4" 
     ] 
    } 
    ] 
} 

Etiketler sideloaded 3. Kimlik Ekle: active_model_serializers belgelerine göre, ben

class DocumentSerializer < ActiveModel::Serializer 
    attributes :id 
    has_many :tags, embed: :id, include: true 

yapmak mümkün olmalıdır ama bu çalışmıyor . Bu sorun için arama denedim ama şimdiye kadar yararlı bir şey bulamadı

undefined method `object' for #<ActsAsTaggableOn::Tag:0x007f258cf1db38> 

: Bunun yerine, bir NoMethodError olsun. Ayrıca diğer gem ile kullanım ile ilgili herhangi bir gemide herhangi bir belge bulamadık. Şüphelerim şu anda, etiketleme gibi davranmanın nasıl uygulandığıyla ilgili bir şey olduğunu, bunun basit bir has_many ilişkisi olmadığını mı? Bu konuda bazı bilgiler sunabiliyor mu? Şimdiden teşekkürler!

+0

ben köz ile ilişkileri nasıl işleneceğini sorabilir miyim? Dokümana nasıl etiket ekleyebilirsin? CreateRecord? –

cevap

11

Sabit! Etiketleri kaldırmak için çıktı, karşılık gelen serializer tanımlanmalıdır. Bunu bilmiyordum çünkü belgeler bir seri hale getiriciye sahip olmanın isteğe bağlı olduğunu ve bir tanesinin yokluğunda bazı varsayılanların kullanılacağını ima ediyor gibi görünüyor. include: true seçeneğini kullanmak istiyorsanız, durum böyle değil. Anahtar görüş here geldi, çok teşekkürler!

Tamlık için ne yaptığımı göstereceğim.Aşağıdaki kod ile tag_serializer.rb oluşturuldu:

module ActsAsTaggableOn 
    class TagSerializer < ActiveModel::Serializer 
    attributes :id, :name 
    end 
end 

ve şimdi benim JSON:

{ 
    "tags": [ 
     { 
     "id": "a33fc396-2428-11e3-8eeb-0800270f33f4", 
     "name": "test" 
     } 
    ], 
    "documents": [ 
     { 
     "id": "c41460fa-2427-11e3-8702-0800270f33f4", 
     "tag_ids": [ 
      "a33fc396-2428-11e3-8eeb-0800270f33f4" 
     ] 
     } 
    ] 
} 
+1

da, "app/serializers/acts_as_taggable_on/tag_serializer.rb" dosyasında "tag_serializer.rb" yi kaydettiğinizden emin olun, böylece Rails – davekaro

+0

'u otomatik olarak yükleyebilir. Ancak bu modül ActsAsTaggableOn'u kaldırmam gerekir. – icemelt