从嵌套的JSON请求创建rails模型 - AssociationTypeMismatch

时间:2011-07-12 01:32:00

标签: ruby-on-rails json restkit

我的应用程序有以下模型类:

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"}

哪个是来自我的使用RestKit的iphone app客户端的完整序列化图。 我在here之类的其他问题上看过,那就是this博客文章。 我的问题是,我不知道如何使用RestKit从我的客户端控制序列化图形,以便构建这样的请求(这样,它可以工作..用调试器测试)

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

任何人都有想法,如果有任何选项,我可以传递给Parent.new方法或自定义RestKit JSON输出,我可以在嵌套的JSON对象中实现model_attributes结构?

由于

1 个答案:

答案 0 :(得分:0)

我已经使用RABL解决了这个问题,这是一个将json渲染为视图的gem。很棒的工作。 这允许我自定义模型的序列化图。

在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"];