2

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

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 应用程序客户端的完整序列化图。我在其他 SO 问题上看到过,比如这里,那是指这篇博文。但是,我的问题是,我不知道如何使用 RestKit 从客户端控制序列化图以构建这样的请求(这样,它可以工作..用调试器测试)

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

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

谢谢

4

1 回答 1

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"];
于 2011-07-14T06:08:58.410 回答