Comment publier un objet de rails à l'aide de RestKit?
-
29-10-2019 - |
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)
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.