Rails RestKit POST-запрос отсутствует корневой класс json - PullRequest
5 голосов
/ 13 января 2012

Привет, ребята, у меня была эта предыдущая проблема, которую я исправил, но я знаю, что исправление определено неправильно.Может ли кто-нибудь указать мне правильное направление для правильного исправления?

, поэтому в основном я создаю объект с iOS sim через RESTkit postObject, и я получил это сообщение

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 

хороший джентльмен отметил, что мой класс внутри моей функции создания принимает только класс: person, который я пропустил.

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

я исправил это, выполнив

@person =Person.new(name:=>params[:name]), так как я толькоотправка {"name"=>"data"} теперь он создает нормально, и я вижу запись на моем ios sim, но я знаю, что это неправильный путь, * правильный путь {"person" => {"name"=>"data"}} должен быть отправлен в исходную функцию.Кроме того, я получаю сообщение об ошибке: не удалось найти объект сопоставления для keyPath: «Есть мысли? Заранее спасибо! Вот мой код x 101 *

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

Ответы [ 3 ]

2 голосов
/ 14 июня 2012

Например, Person:

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

Чтобы настроить RestKit на POST с корневым путем, замените:

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

на:

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

Теперь Rails получит {"person" => {"name"=>"data"}} вместо {"name"=>"data"}.

Для справки вот magic из 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];
}

это делает и setMapping и setSerializationMapping с умным [objectMapping inverseMapping] трюком.

0 голосов
/ 19 мая 2012

Ради завершенности ошибка "не удалось найти сопоставление для ключевого пути" ", похоже, связана с действием Rails create.

В этом вопросе SO есть хороший ответ на эту проблему: как разместить объект в Rails с помощью RESTKit

0 голосов
/ 14 января 2012

Да, наконец, понял это.Отображение было неверным.Вместо addObjectMapping: dataMapping это должен был быть userMapping с keyPath человек, который userMapping.Кстати, @favo для редактирования моей куриной царапины =] теперь она может GET и POST отлично!

...