Создание модели рельсов из вложенного JSON-запроса - AssociationTypeMismatch

Мое приложение имеет следующие классы моделей:

class Parent < ActiveRecord::Base
    # Setup accessible (or protected) attributes for your model
    attr_accessible :child_attributes, :child

    has_one :child

    accepts_nested_attributes_for :child

    #This is to generate a full JSON graph when serializing
    def as_json(options = {})
        super(options.merge, :include => {:child => {:include => :grandchild } })
    end
end

class Child < ActiveRecord::Base
    # Setup accessible (or protected) attributes for your model
    attr_accessible :grandchild_attributes, :grandchild

    belongs_to :parent
    has_one :grandchild

    accepts_nested_attributes_for :grandchild
end

class Grandchild < ActiveRecord::Base
    belongs_to :child
end

В моем контроллере у меня есть create метод, определяемый следующим образом:

def create
    @parent = Parent.new(params[:parent])
    #Rest ommited for brevity - just respond_with and save code
    end
end

Мой запрос отображается в журналах как:

Parameters: {"parent"=>{"child"=>{"grandchild"=>{"gc_attr1"=>"value1", "gc_attr2"=>"value2"}}, "p_attr1"=>"value1"}

Это полный график сериализации, полученный от моего клиента приложения для iphone, использующего RestKit. Я видел на других SO вопросы, как здесь, это относится к этому сообщению в блоге. Моя проблема, однако, в том, что я не знаю, как управлять сериализованным графом со стороны моего клиента с помощью RestKit для того, чтобы построить такой запрос (и таким образом, он работает.. протестировано с отладчиком)

Parameters: {"parent"=>{"child_attributes"=>{"grandchild_attributes"=>{"gc_attr1"=>"value1", "gc_attr2"=>"value2"}}, "p_attr1"=>"value1"}

У кого-нибудь есть идеи, есть ли какая-либо опция, которую я могу передать методу Parent.new или настроить вывод JSON RestKit таким образом, чтобы я мог достичь структуры model_attributes во вложенных объектах JSON?

Спасибо

1 ответ

Решение

Я решил эту проблему с помощью RABL, который является жемчужиной для рендеринга json как представлений. Потрясающая работа. Это позволило мне настроить график сериализации моей модели.

На стороне RestKit (используя OM2.0 - сопоставление новых объектов) я изменил все свои отображения на child_attributes для всех отношений, например:

RKObjectMapping* parentMapping = ... //Initialize your mapping here
RKObjectMapping* childMapping  = ... //Initialize your mapping here

//Configure mapping relationship with child
[parentMapping  mapKeyPath:@"child_attributes" toRelationship:@"childProperty" withObjectMapping:childMapping];

//Register mappings
RKObjectManager* manager = [RKObjectManager sharedManager];
[manager.mappingProvider registerMapping:parentMapping withRootKeyPath:@"parent"];
[manager.mappingProvider registerMapping:childMapping withRootKeyPath:@"child"];
Другие вопросы по тегам