加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – Rails RestKit POST请求缺少json的根类

发布时间:2020-12-14 19:12:43 所属栏目:百科 来源:网络整理
导读:嗨伙计们,我有这个我修复过的问题,但我知道修复是没有做正确的方法.有人能指出我正确的方向进行正确的修复吗? 所以基本上我通过RESTkit postObject使用iOS sim创建一个对象,我收到了这条消息 Processing PeopleController#create (for 127.0.0.1 at 2012-01
嗨伙计们,我有这个我修复过的问题,但我知道修复是没有做正确的方法.有人能指出我正确的方向进行正确的修复吗?

所以基本上我通过RESTkit postObject使用iOS sim创建一个对象,我收到了这条消息

Processing PeopleController#create (for 127.0.0.1 at 2012-01-13 03:55:46) [POST]
  Parameters: {"name"=>"data"}

Person Create (0.4ms)   INSERT INTO "people" ("created_at","updated_at","name")
VALUES('2012-01-13 11:55:46','2012-01-13 11:55:46',NULL)
Completed in 27ms (View: 1,DB: 0) | 200 OK

一位优秀的先生们指出,我的创建函数中的类只接受了一个我忽略的人类.

def create
@person = Person.new(params[:person]),thus looking for {"person" => {"name"=>"data"}}

我这样做了

@person = Person.new(姓名:=> params [:name]),因为我只发送{“name”=>“data”}
现在它创建好了,我可以看到我的ios sim上的条目,但我知道这不是正确的方式应该是{“person”=> {“name”=>“data”}}发送到原始函数.另外我的错误找不到keyPath的对象映射:“有什么想法吗?提前thnx!
这是我的xcode

@interface Data: NSObject{// imaginary over arching class
   Person * person;
   NSArray *dog;
@property (nonatomic,retain) Person * person;
@property (nonatomic,retain) NSArray * dog;

@interface Data : NSObject {
Person *person;
NSArray *dogs;
}
@property (nonatomic,retain) Person *person;
@property (nonatomic,retain) NSArray *dogs;
@end

@interface Person : NSObject {

NSString *name;
NSNumber *personId;
NSDate   *updatedAt;
NSDate   *createdAt;

}

@property (nonatomic,retain) NSDate * createdAt;
@property (nonatomic,retain) NSDate * updatedAt;
@property (nonatomic,retain) NSNumber  *personId;
@property (nonatomic,retain) NSString *name;
@end

RKObjectMapping* userMapping = [RKObjectMapping mappingForClass:[Person class]];

[userMapping mapKeyPath:@"created_at" toAttribute:@"createdAt"];
[userMapping mapKeyPath:@"updated_at" toAttribute:@"updatedAt"];
[userMapping mapKeyPath:@"name" toAttribute:@"name"]; 
[userMapping mapKeyPath:@"id" toAttribute:@"personId"];

RKObjectMapping* dogMapping = [RKObjectMapping mappingForClass:[Dog class]];
[dogMapping mapKeyPath:@"created_at" toAttribute:@"createdAt"]; 
[dogMapping mapKeyPath:@"person_id" toAttribute:@"spersonId"]; 
[dogMapping mapKeyPath:@"name" toAttribute:@"name"]; 
[dogMapping mapKeyPath:@"updated_at" toAttribute:@"updatedAt"]; 
[dogMapping mapKeyPath:@"id" toAttribute:@"dogId"]; 

RKObjectMapping *dataMapping = [RKObjectMapping mappingForClass:[Data class]]; 
[dataMapping mapKeyPath:@"dog" toAttribute:@"dogs"]; 
[dataMapping mapKeyPath:@"person" toRelationship:@"person" withMapping:userMapping]; 
[[RKObjectManager sharedManager].mappingProvider addObjectMapping:dataMapping]; 

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/people"       
objectMapping:dataMapping delegate:self]; 

RKObjectRouter * router = [RKObjectManager sharedManager].router;
[router routeClass: [Person class] toResourcePath:@"/people/:personId"];
[router routeClass: [Person class] toResourcePath:@"/people"          
forMethod:RKRequestMethodPOST];

RKObjectMapping *personSerializationMapping = [RKObjectMapping mappingForClass:
[NSMutableDictionary class]];
[personSerializationMapping attribute:@"name",nil];
[RKObjectManager sharedManager].mappingProvider 
setSerializationMapping:personalSerializationMapping forClass: [Person class]];

Person *dave = [[Person alloc]init];
dave.name = @"Dave";
[[RKObjectManager sharedManager] postObject:dave delegate:self];
}

解决方法

以人为例:

RKObjectMapping* userMapping = [RKObjectMapping mappingForClass:[Person class]];

[userMapping mapKeyPath:@"created_at" toAttribute:@"createdAt"];
[userMapping mapKeyPath:@"updated_at" toAttribute:@"updatedAt"];
[userMapping mapKeyPath:@"name" toAttribute:@"name"]; 
[userMapping mapKeyPath:@"id" toAttribute:@"personId"];

要使用根路径将RestKit配置为POST,请替换:

[[[RKObjectManager sharedManager] mappingProvider] 
         setSerializationMapping:personalSerializationMapping 
                        forClass:[Person class]];

有:

[[[RKObjectManager sharedManager] mappingProvider]
                 registerMapping:objectMapping 
                 withRootKeyPath:@"person"];

现在Rails将收到{“person”=> {“name”=>“data”}}而不是{“name”=>“data”}.

作为参考,这里是registerMapping的魔力:

- (void)registerObjectMapping:(RKObjectMapping *)objectMapping withRootKeyPath:(NSString *)keyPath {
    // TODO: Should generate logs
    objectMapping.rootKeyPath = keyPath;
    [self setMapping:objectMapping forKeyPath:keyPath];
    RKObjectMapping* inverseMapping = [objectMapping inverseMapping];
    inverseMapping.rootKeyPath = keyPath;
    [self setSerializationMapping:inverseMapping forClass:objectMapping.objectClass];
}

它使用聪明的[objectMapping inverseMapping]技巧同时执行setMapping和setSerializationMapping.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读