objective-c – Rails RestKit POST请求缺少json的根类
嗨伙计们,我有这个我修复过的问题,但我知道修复是没有做正确的方法.有人能指出我正确的方向进行正确的修复吗?
所以基本上我通过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”} @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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |