Question

Je suis en train de faire de la magie avec RestKit et de Rails.Je suis à l'aide de Rails 3.1.1, et RestKit 0.9.3 (pas la branche master).Je suis en utilisant la Base de Données dans mon application iOS, donc je suis en train de configuration de l'application pour utiliser autant RestKit magie possible d'interagir avec l'application rails.

Cependant, je vais avoir un problème, essayez de POSTER un nouvel objet de mon serveur pour être créé.J'ai réussi à OBTENIR de l'ed les objets vers le bas.Voici mon code pour le faire:

RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:@"http://IP_ADDRESS"];
manager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"magikarp.sqlite"];
manager.client.requestQueue.showsNetworkActivityIndicatorWhenBusy = YES;
manager.acceptMIMEType = RKMIMETypeJSON; 
manager.serializationMIMEType = RKMIMETypeJSON; 

///
/// Setup Routing
///

RKObjectRouter *router = [[RKObjectRouter alloc] init];
[router routeClass:[List class] toResourcePath:@"/lists/(listID)"];
[router routeClass:[List class] toResourcePath:@"/lists" forMethod:RKRequestMethodPOST];
manager.router = router;

///
/// Setup mapping for my "List" object; a subclass of NSManagedObject
///
RKManagedObjectMapping *listMapping = [RKManagedObjectMapping mappingForClass:[List class]];
listMapping.primaryKeyAttribute = @"listID";

[listMapping mapAttributes:@"title", nil];
[listMapping mapKeyPath:@"id" toAttribute:@"listID"];
[manager.mappingProvider setMapping:listMapping forKeyPath:@"list"];

Qui semble bien fonctionner pour moi.Maintenant, je veux mettre un objet nouvellement créé sur le serveur.

- (void)createList:(NSString *)listName {
    List *newList = [List object];
    newList.title = listName;
    [[RKObjectManager sharedManager] postObject:newList delegate:self]; 
}

J'appelle cette méthode avec le nom que je veux la nouvelle liste pour avoir.Cette méthode est appelée, mais j'ai cette erreur:

2011-12-06 19:24:17.822 Magikarp[13921:14c1b] W restkit.object_mapping:RKObjectMapper.m:74 Adding mapping error: Could not find an object mapping for keyPath: ''
2011-12-06 19:24:17.823 Magikarp[13921:14c1b] E restkit.network:RKObjectLoader.m:190 Encountered errors during mapping: Could not find an object mapping for keyPath: ''
2011-12-06 19:24:17.823 Magikarp[13921:14c1b] Hit error: Error Domain=org.restkit.RestKit.ErrorDomain Code=1001 "Could not find an object mapping for keyPath: ''" UserInfo=0x6bb9da0 {=RKObjectMapperKeyPath, NSLocalizedDescription=Could not find an object mapping for keyPath: ''}

La tentative que j'ai faite pour obtenir la cartographie a été:

RKObjectMapping *listSerializationMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
[listSerializationMapping mapKeyPath:@"title" toAttribute:@"title"];
[listSerializationMapping mapKeyPath:@"ListID" toAttribute:@"id"];
[manager.mappingProvider setSerializationMapping:listSerializationMapping forClass:[List class]];

(Qui donne l'erreur ci-dessus).Je sais qu'il est assez simple façon de le faire, mais aucun de ces exemples ont ce code, et l'ensemble de la documentation semble hors de date...Avez-vous d'envoyer l'info que la POSTE, les paramètres ainsi?De l'aide serait apprécié, Merci!

Mise à jour
C'est la réponse du serveur, il fonctionne, mais il semble que les paramètres sont un peu foiré?(Le titre que j'ai mis dans a:"Fait à partir de l'iPhone 2!")

Started POST "/lists" for 129.21.86.32 at 2011-12-07 09:34:43 -0500
  Processing by ListsController#create as JSON
  Parameters: {"id"=>0, "title"=>"Made from the iPhone 2!", "list"=>{"id"=>0, "title"=>"Made from the iPhone 2!"}}
WARNING: Can't verify CSRF token authenticity
WARNING: Can't mass-assign protected attributes: id
   (0.3ms)  BEGIN
  SQL (0.9ms)  INSERT INTO "lists" ("created_at", "title", "updated_at") VALUES ($1, $2, $3) RETURNING "id"  [["created_at", Wed, 07 Dec 2011 14:34:43 UTC +00:00], ["title", "Made from the iPhone 2!"], ["updated_at", Wed, 07 Dec 2011 14:34:43 UTC +00:00]]
   (16.4ms)  COMMIT
Completed 201 Created in 77ms (Views: 1.8ms | ActiveRecord: 21.9ms)
Était-ce utile?

La solution

Je pense que le inverseMapping sélecteur devrait être assez pour faire une cartographie de la sérialisation

RKManagedObjectMapping *listMapping = [RKManagedObjectMapping mappingForClass:[List class]];
listMapping.primaryKeyAttribute = @"listID";

[listMapping mapAttributes:@"title", nil];
[listMapping mapKeyPath:@"id" toAttribute:@"listID"];
[manager.mappingProvider setMapping:listMapping forKeyPath:@"list"];
//this should be enough
[manager.mappingProvider setSerializationMapping:[listMapping inverseMapping] forClass:[List class]];

Edit:

selon notre conversation, les mises en garde produite par RestKit ont été causés par le fait que la réponse du serveur a été dépourvues de la racine du chemin d'accès clé (retourné comme nu, array).Pour résoudre le problème, nous devons dire RestKit l'usage de la cartographie de la carte de la réponse:

mapping = [[[RKObjectManager sharedManager] mappingProvider] mappingForKeyPath:@"list"];
[[RKObjectManager sharedManager] postObject:newList mapResponseWith:mapping delegate:self];

Autres conseils

Ceci provient de la documentation RestKit.Il existe une méthode pratique qui définit à la fois le mappage et le mappage de sérialisation

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

Cela appellera setMapping: forKeyPath: pour vous, puis générera un mappage de sérialisation et définira également le keyPath racine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top