2012-01-13 17 views
5

Hola chicos tuve este problema anterior que arreglé, pero sé que la corrección no se hizo de la manera correcta. ¿Puede alguien señalarme en la dirección correcta para la solución correcta?Rails RestKit POST request Falta la clase raíz de json

así que básicamente se crea un objeto con iOS SIM a través de RESTkitpostObject y conseguí este mensaje

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 agradable muchacho señalaron que mi clase dentro de mi función de crear solamente está aceptando una: Clase de persona que he pasado por alto .

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

i fijo esto haciendo

@person =Person.new(name:=>params[:name]) ya que sólo estoy enviando {"name"=>"data"} ahora se crea bien y puedo ver la entrada en mis ios sim pero sé que esto no es la forma correcta de la manera correcta debe ser {"person" => {"name"=>"data"}} enviado a la función original. Además mi me sale un error no pudo encontrar un mapeo objeto para keyPath:" Cualquier pensamiento y thnx de antemano aquí está mi 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 para la edición de mi pollo cero =] –

Respuesta

0

Sí, finalmente lo descubrió El mapeo estaba mal lugar de addObjectMapping: dataMapping?!.. , que debería haber sido userMapping con keyPath persona que es userMapping. thnx por cierto @favo para la edición de mi pollo cero =] ahora se puede GET y POST bien!

+0

es en realidad aún no funciona me olvidé que han pirateado el código fuente en los carriles para crear def a tomar en un nombre en lugar de una persona, sino que se rompió la pagina web del servidor .. . Entonces todavía no funciona = / –

2

Take Person como ejemplo:

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

en las configuraciones RestKit-POST con una ruta de raíz, reemplace:

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

con:

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

Ahora los raíles recibirán {"person" => {"name"=>"data"}} en lugar de {"name"=>"data"}.

Para referencia, aquí es la magia de 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 hace tanto setMapping y setSerializationMapping con los inteligentes [objectMapping inverseMapping] truco.