Hoe POST een object op rails met behulp van RestKit?

Ik probeer de magie te laten gebeuren met RestKit en Rails. Ik gebruik Rails 3.1.1 en RestKit 0.9.3 (niet de mastertak). Ik gebruik basisgegevens in mijn iOS-app, dus ik probeer de app in te stellen om zoveel mogelijk RestKit-magie te gebruiken om te communiceren met de rails-app.

Ik heb echter een probleempoging om een ​​nieuw object POST te maken naar mijn server. Ik heb de voorwerpen met succes GET'ed. Hier is mijn code om dat te doen:

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"];

Dat lijkt goed te werken voor mij. Nu wil ik een nieuw gemaakt object terug naar de server POSTEN.

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

Ik noem deze methode met de naam die ik wil dat de nieuwe lijst heeft. Deze methode wordt aangeroepen, maar ik krijg de volgende foutmelding:

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: ''}

De poging die ik deed om de mapping gedaan te krijgen was:

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

(Dat geeft de bovenstaande fout). Ik weet dat er een vrij eenvoudige manier is om dit te doen, maar geen van de voorbeelden heeft deze code en alle documentatie lijkt verouderd ... Moet je de info ook als POST-parameters verzenden? Hulp wordt op prijs gesteld, bedankt!

Update
This is the server response - it works, but it appears that the parameters are a bit messed up? (The title I put in was: "Made from the 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)
6

2 antwoord

Ik denk dat de selector van inverseMapping voldoende moet zijn om een ​​serialisatie-mapping te maken

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]];

Bewerk:

volgens ons chatgesprek werden de waarschuwingen geproduceerd door RestKit veroorzaakt door het feit dat de serverrespons ontbrak aan de root KeyPath (geretourneerd als naked array). Om het probleem op te lossen, moeten we RestKit vertellen specifieke mapping te gebruiken om de respons in kaart te brengen:

mapping = [[[RKObjectManager sharedManager] mappingProvider] mappingForKeyPath:@"list"];
[[RKObjectManager sharedManager] postObject:newList mapResponseWith:mapping delegate:self];
8
toegevoegd
Welnu, jouw manier werkt, dus bedankt! Maar voordat ik het goedkeur, krijg ik nog altijd de fouten/waarschuwingen die ik hierboven heb gepost ... maar het werkt nog steeds. Gedachten?
toegevoegd de auteur Ethan Mick, de bron
Ik heb een update toegevoegd aan het OP. Het lijkt erop dat de parameters een beetje in de war zijn, maar rails zoekt het uit? Het stuurt ook een ID, wat niet correct lijkt ...
toegevoegd de auteur Ethan Mick, de bron
Sorry ... hoe zou ik het krijgen van die logboeken voor u? Het verzoek en de reactie? Bedankt dat je me hebt geholpen.
toegevoegd de auteur Ethan Mick, de bron
toegevoegd de auteur Ethan Mick, de bron
Het werkt - u bedoelt dat het object newList met succes is gepost? Welke reactie produceert uw server bij het invullen van een POST-aanvraag?
toegevoegd de auteur mja, de bron
Het zou beter zijn als je RestKit-logs kunt plaatsen, zodat ik kan zien hoe het verzoek en de respons eruit zien.
toegevoegd de auteur mja, de bron
Stel gewoon fijner logniveau in voor RestKit, - RKLogConfigureByName ("RestKit/*", RKLogLevelTrace); in uw AppDelegate
toegevoegd de auteur mja, de bron

Dit komt van de RestKit-documenten. Er is een gemaksmethode die zowel mapping- als serialisatiekartering instelt

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

Hiermee wordt setMapping aangeroepen: forKeyPath: genereer voor u vervolgens een serialisatiekartering en stel ook de root keyPath in.

2
toegevoegd