2013-08-29 4 views
0

JSON을 통해 레일즈 서버에 객체를 게시하기 위해 Restats 0.20 (처음)을 사용했고, 마지막 날에 성가신 매핑 오류로 인해 막혔습니다. 2 개체의 그림 및 항목이 있습니다.Restkit 0.20 keypath error 1001

Picture 
{ 
"base64" : null, 
"id" : 1, 
"created_at" : "2013-08-28T15:08:49Z", 
"user_nickname" : "user_name", 
"tag" : "ALPHA", 
"nbitems" : null, 
"path" : { 
    "url" : "https://www.mywebsite/pictures/1/default.jpg" 
}, 
"updated_at" : "2013-08-28T15:08:49Z", 
"user_id" : 1 
} 


Item 
{ 
"base64" : null, 
"picture_id" : 1, 
"id" : 1, 
"created_at" : "2013-08-28T15:10:54Z", 
"itemurl" : { 
    "url" : "https://www.mywebsite/pictures/1/item1.png" 
}, 
"nickname" : "", 
"user_id" : 1, 
"updated_at" : "2013-08-28T15:10:54Z" 
} 

는 여기가의 ViewController의 사진 인스턴스를 게시

//Mapping users 
RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([User class]) inManagedObjectStore:manager.managedObjectStore]; 
[userMapping addAttributeMappingsFromDictionary:@{ 
@"id" : @"user_id", 
@"email" : @"email", 
@"nickname" : @"nickname", 
@"created_at" : @"createdAt" 
}]; 
userMapping.identificationAttributes = @[ @"user_id" ]; 


//Mapping paths 
RKEntityMapping *pathMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Path class]) inManagedObjectStore:manager.managedObjectStore]; 
[pathMapping addAttributeMappingsFromDictionary:@{ 
@"url" : @"url" 
}]; 

//Mapping itemURL 
RKEntityMapping *itemURLMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([ItemURL class]) inManagedObjectStore:manager.managedObjectStore]; 
[pathMapping addAttributeMappingsFromDictionary:@{ 
@"url" : @"url" 
}]; 


//Mapping pictures 
RKEntityMapping *pictureMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Picture class]) inManagedObjectStore:managedObjectStore]; 
[pictureMapping addAttributeMappingsFromDictionary:@{ 
@"id" : @"picture_id", 
@"user_id" : @"user_id", 
@"user_nickname" : @"user_nickname", 
@"nbitems" : @"nbitems", 
@"tag" : @"tag", 
@"base64" : @"base64", 
@"created_at" : @"createdAt" 
}]; 
pictureMapping.identificationAttributes = @[ @"picture_id"]; 
[pictureMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"path" toKeyPath:@"path" withMapping:pathMapping]]; 

[manager addResponseDescriptorsFromArray:@[ 
[RKResponseDescriptor responseDescriptorWithMapping:pictureMapping 
             pathPattern:@"pictures" 
             keyPath:nil 
             statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)] 
]]; 

RKObjectMapping *pictureRequestMapping = [RKObjectMapping requestMapping]; 
[pictureRequestMapping addAttributeMappingsFromArray:@[@"user_id", @"user_nickname", @"tag", @"base64", @"path"]]; 
RKRequestDescriptor *pictureRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:pictureRequestMapping objectClass:[Picture class] rootKeyPath:@"picture" method:RKRequestMethodAny]; 
[manager addRequestDescriptor:pictureRequestDescriptor]; 


//Mapping items 
RKEntityMapping *itemMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Item class]) inManagedObjectStore:managedObjectStore]; 
itemMapping.identificationAttributes = @[ @"item_id"]; 
[itemMapping addAttributeMappingsFromDictionary:@{ 
@"id" : @"item_id", 
@"picture_id" : @"picture_id", 
@"user_id" : @"user_id", 
@"nickname" : @"nickname", 
@"base64" : @"base64", 
@"created_at" : @"createdAt" 
}]; 
RKRelationshipMapping *itemURLRelation = [RKRelationshipMapping relationshipMappingFromKeyPath:@"itemurl" toKeyPath:@"itemurl" withMapping:itemURLMapping]; 
[itemMapping addPropertyMapping:itemURLRelation]; 

RKResponseDescriptor *itemDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:itemMapping 
             pathPattern:@"items" 
              keyPath:nil 
             statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 
[manager addResponseDescriptor:itemDescriptor]; 

RKObjectMapping *itemRequestMapping = [RKObjectMapping requestMapping]; 
[itemRequestMapping addAttributeMappingsFromArray:@[@"picture_id", @"user_id", @"nickname", @"base64", @"itemurl"]]; 
RKRequestDescriptor *itemRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:itemRequestMapping objectClass:[Item class] rootKeyPath:@"item" method:RKRequestMethodAny]; 
[manager addRequestDescriptor:itemRequestDescriptor]; 

AppDelegate.m 내 매핑 그리고 그것은

- (void)uploadPicture:(UIImage *)chosenImage{ 
    NSManagedObjectContext *moc = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext; 
UIImage *resizedImage = [self scaleImage:chosenImage maxWidth:640 maxHeight:960]; 
NSString *imageEncoded = [self image2jpg2String:resizedImage]; 

Picture *picture = [Picture insertInManagedObjectContext:moc]; 
picture.user_id = userId; 
picture.user_nickname = @"user_nickname"; 
picture.tag = @"ALPHA"; 
picture.base64 = imageEncoded; 

[[RKObjectManager sharedManager] postObject:picture path:@"pictures" parameters:nil success:nil failure:^(RKObjectRequestOperation *operation, NSError *error) { NSLog(@"Error: %@",error);}]; 
    } 

은 내가 항목과 동일한 작업을 수행하려고 완벽하게 작동 다른 컨트롤러의 인스턴스

- (void)uploadItem{ 
    NSManagedObjectContext *mocFVC = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext; 
NSNumber *userId = [NSNumber numberWithInt:1]; 
UIImage *itemImage = self.itemImage.image; 
UIImage *resizedItem = [self scaleImage:itemImage maxWidth:640 maxHeight:960]; 
NSString *itemEncoded = [self image2png2String:resizedItem]; 

Item *item = [Item insertInManagedObjectContext:mocFVC]; 
item.user_id = userId; 
item.nickname = @"user_nickname"; 
item.picture_id = pictureToDisplay.picture_id; 
item.base64 = itemEncoded; 

[[RKObjectManager sharedManager] postObject:item path:@"items" parameters:nil success:nil failure:^(RKObjectRequestOperation *operation, NSError *error) { NSLog(@"Error: %@",error);}];  
    } 

하지만이 item.base64를 언급하지 않는 한, 엑스 코드는 항상 내가 유래에 포스트를 많이 확인하고 게시하기 전에 restkit의 문서를 읽을 수 있지만 그렇지 않은 이유를 이해하지 않습니다

2013-08-28 22:51:41.116 MYPROJECT[4588:1603] E restkit.network:RKObjectRequestOperation.m:243 POST 'http://www.mywebsite/items' (422 Unprocessable Entity/0 objects) [request=0.6791s mapping=0.0000s total=0.7111s]: Error Domain=org.restkit.RestKit.ErrorDomain Code=1001 "No mappable object representations were found at the key paths searched." 
    UserInfo=0x1e8af330 {DetailedErrors=(), NSLocalizedFailureReason=The mapping operation was unable to find any nested object representations at the key paths searched: error 
    The representation inputted to the mapper was found to contain nested object representations at the following key paths: itemurl 

    This likely indicates that you have misconfigured the key paths for your mappings., NSLocalizedDescription=No mappable object representations were found at the key paths searched., keyPath=null} 

    2013-08-28 22:51:41.119 MYPROJECT[4588:907] Error: Error Domain=org.restkit.RestKit.ErrorDomain Code=1001 "No mappable object representations were found at the key paths searched." UserInfo=0x1e8af330 {DetailedErrors=(), NSLocalizedFailureReason=The mapping operation was unable to find any nested object representations at the key paths searched: error 

    The representation inputted to the mapper was found to contain nested object representations at the following key paths: itemurl 

    This likely indicates that you have misconfigured the key paths for your mappings., NSLocalizedDescription=No mappable object representations were found at the key paths searched., keyPath=null} 

다음과 같은 오류를 반환 코드 및 그림 모델이 내 Item 클래스에 사용하는 것과 매우 흡사하기 때문에 내 항목에서 작동합니다. 내가 놓친 게 있니? 어떤 생각? :)

+0

실제로 와이어에 닿는 것과 서버에서 어떤 일이 발생했는지 확인 했습니까? 표시되는 메시지는 서버가 오류를 반환하고 있음을 나타냅니다. – Wain

답변

0

@Wain 로그에 아무것도 표시되지 않았습니다.

Restkit 부품이 올바르지 않습니다. 오류는 모델의 내 base64/upload 함수에서 발생했습니다.

def base64=(data) 
# decode data and create stream on them 
filename = "#{self.user_id}.png" 
io = CarrierStringIO.new(filename, Base64.decode64(data)) 

# this will do the thing (photo is mounted carrierwave uploader) 
self.path = io 
end 

파일 이름 줄은 웹 브라우저에서 작동하지만 JSON은 사용하지 않습니다. #weird user_id를 데이터로 유지하기 위해 파일의 경로를 변경해야했습니다.