2012-10-22 16 views
5

Wdrażamy funkcję korzystającą z danych Ember i Railsów i ciągle uderzając w przeszkodę. Nie jesteśmy pewni, czy to jest problem z naszym kodem, błąd z danymi Ember lub Ember, czy tylko, że nie otrzymujemy go z powodu braku dokumentacji.Stowarzyszenia Ember i zagnieżdżone adresy URL

Każda pomoc będzie naprawdę doceniana.

Szyny

Mamy do zrobienia, z wieloma wpisami. W Rails, są one ustawione w następujący sposób:

class ToDo < ActiveRecord::Base 
    has_many :to_do_entries, dependent: :destroy 
    alias_method :entries, :to_do_entries 
    validates_presence_of :title 
end 

class ToDoEntry < ActiveRecord::Base 
    attr_accessible :completed_at, :is_deleted, :priority, :title 

    belongs_to :to_do 
    alias_method :parent, :to_do 

    validates_presence_of :to_do, :title  
end 

Trasy są ustawione jako zagnieżdżony:

resources :to_dos do 
    resources :to_do_entries do 
    end 
end 

I tak URL końcowe skończyć się /to_do /: to_do_id/to_do_entry /: to_do_entry_id.

Używamy gem active_model_serializers i mają następujące serializers skonfigurować:

class ToDoSerializer < ActiveModel::Serializer 
    attributes :id, 
      :title 

    has_many :to_do_entries, embed: :objects 
end 

class ToDoEntrySerializer < ActiveModel::Serializer 
    attributes :id, 
      :to_do_id, 
      :title, 
      :priority 

    has_one :to_do 
end 

Ember

Używamy dane Ember i adaptera spoczynku i równoważne modele są ustawione w następujący sposób:

App.ToDo = DS.Model.extend({ 
    title: DS.attr('string'), 
    entries: DS.hasMany('App.ToDoEntry', { embedded: true }) 
}); 

App.ToDoEntry = DS.Model.extend({ 
    title: DS.attr('string'), 
    to_do_id: DS.attr('number'), 
    priority: DS.attr('number'), 
    todo: DS.belongsTo('App.ToDo') 
}); 

problem

moim rozumieniu jest to, że powinniśmy być w stanie uzyskać dostęp do listy wpisów bezpośrednio z Todo, za pomocą następujących czynności w konsoli:

> t = App.ToDo.find(21) 
> e = t.get("entries") 

To wydaje się działać, ale po prostu zwraca klasę i Nie mam pojęcia, jak to debugować i sprawdzić, czy działa.

Mam dwa konkretne pytania:

  1. Jak możemy Debug za pomocą konsoli, stowarzyszenia i upewnij się, że są one prawidłowo działać.

  2. Jeśli załadujemy wpisy osobno (zamiast umieszczać je w rodzicu), w jaki sposób możemy użyć tych zagnieżdżonych tras, takich jak ta, którą mamy powyżej?

+0

Można coś zrobić PR w jak 't.get (" wpisy "). toArray()'. Będziesz w stanie zweryfikować identyfikatory. I możesz zrobić coś takiego jak 't.get (" wpisy "). ToArray() [0] .get ('title')', aby sprawdzić daną właściwość. Nie wierzę, że linie gniazdowe są obsługiwane po wyjęciu z pudełka z adapterem REST. W rzeczywistości był to [problem] (https://github.com/emberjs/data/issues/170) o tym, który otworzyłem i został on teraz zamknięty. Miałem jeszcze szansę spróbować zaimplementować trasy zagnieżdżone w moim adapterze (na razie używam na serwerze obejścia). –

Odpowiedz

4

Po pierwsze, uzyskanie powiązania z modelu zwraca wartość DS.ManyArray, która zawiera obiekty, takie jak zakładałeś.
Istnieje kilka sposobów debugowania tego, po pierwsze odpowiada normalnym metodom tablicowym, takim jak length, firstObject, lastObject, objectAt.
Jeśli to nie wystarczy, odpowiada również na toArray, która przekształca go w wanardową tablicę JS.

Niestety, najnowsza iteracja danych emberowych faktycznie usuwa osadzone rekordy (myślę, że to może być tymczasowe).Obecnie zagnieżdżone adresy zasobów nie są obsługiwane przez domyślną RESTAdapter, ale zawsze można go dostosować do własnych potrzeb

Istnieje jednak praca wykonywana na uzyskanie zagnieżdżone zasoby w rdzeniu zobaczyć #367 i #257

+0

Świetnie, dzięki. To naprawdę pomogło. Wygląda na to, że byliśmy w połowie drogi, ale mieliśmy problem z nazewnictwem i inflectorem (lub brakiem). Napiszę post na blogu, aby podzielić się tym, co dowiedzieliśmy się po drodze. –