2012-01-13 18 views
5

ciao ragazzi ho avuto questo problema precedente che ho risolto, ma so che la correzione è def non eseguita nel modo giusto. Qualcuno può indicarmi la giusta direzione per la correzione giusta?Rails RestKit POST richiesta mancante della classe radice di json

in modo sostanzialmente crea un oggetto con iOS sim tramite RESTkitpostObject e ho ricevuto questo messaggio

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 

un bel signore ha sottolineato che la mia classe dentro la mia funzione di creare è solo accettando una: Persona di classe che ho trascurato .

def create 
@person = Person.new(params[:person]) , thus looking for {"person" => {"name"=>"data"}} 

Ho fissato questo facendo

@person =Person.new(name:=>params[:name]) Dato che io sono solo l'invio di {"name"=>"data"} ora crea ok e posso vedere la voce sul mio IOS sim, ma so che questo non è il modo giusto nel modo giusto dovrebbe essere {"person" => {"name"=>"data"}} inviato alla funzione originale. Più il mio ottengo un errore non riusciva a trovare una mappatura oggetto per percorso chiave:" Ogni pensiero e thnx in anticipo ecco la mia Xcode

@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]; 
} 
+0

thnx @favo per modificare il mio graffio di pollo =] –

risposta

0

Sì finalmente capito che la mappatura è stato sbagliato Invece di addObjectMapping: dataMapping?!.. , avrebbe dovuto essere userMapping con keyPath persona che è userMapping. btw thnx @favo per la modifica il mio zero pollo =] ora può GET e POST bene!

+0

IT ancora in realtà non funziona ho dimenticato di aver hackerato il codice sorgente in Rails per def creare di prendere in un nome invece di una persona ma che ha rotto il webside del server .. . quindi non funziona ancora = / –

0

per l'amor Completionist, l'errore di "non poteva trovare la mappatura per la chiave il percorso '' "sembra essere una cosa con Rails crea azione.

C'è una buona risposta per questo problema in questa domanda SO: how to post an object to Rails using RESTKit

2

Prendere Person come esempio:

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

Per config RestKit-POST con un percorso principale, sostituire:

[[[RKObjectManager sharedManager] mappingProvider] 
     setSerializationMapping:personalSerializationMapping 
         forClass:[Person class]]; 

con:

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

Ora Rails riceverà {"person" => {"name"=>"data"}} anziché {"name"=>"data"}.

Per riferimento, ecco la magia di 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]; 
} 

lo fa sia setMapping e setSerializationMapping con l'intelligente [objectMapping inverseMapping] trucco.

Problemi correlati