2012-01-13 5 views
5

こんにちは、私は修正済みのこの前の問題を抱えていましたが、修正は正しい方法で行われていません。ある人が正しい修正をするために正しい方向に向けることができますか?Rails RestKit POSTリクエストjsonのルートクラスがありません

ので、基本的に私はRESTkitpostObject経由でiOSのシムを持つオブジェクトを作成し、私はこのメッセージ

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 

素敵な紳士が私の関数を作成し内部の私のクラスのみを受け入れていることを指摘しました:私は見落とさ人のクラスを。

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

私だけ{"name"=>"data"} を送信しておりますので、私は今、それはOK作成し、私は私のiOSシム上のエントリを見ることができますが、私は、これは正しい方法、正しい方法ではありません知っている

@person =Person.new(name:=>params[:name])を行うことによって、これを固定元の関数に送信される{"person" => {"name"=>"data"}}である必要があります。 「任意の考えをとのthnx事前に ここでいやがついにそれを考え出し

@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私のチキンスクラッチを編集するための] –

答えて

0

私のXcodeでマッピングが間違っていたの代わりにaddObjectMapping: dataMapping:プラス、私は、私はエラーがキーパスのオブジェクトのマッピングを見つけることができませんでした取得します?!。。 、それはuserMappingあるkeyPath人とuserMappingされている必要があります。ところでのthnx @favo私のチキンスクラッチ=]今それができGETPOST罰金を編集するために!

+0

ITは実際にはまだ動作していません私は人の代わりに名前を取るdef createを作成するためにRailsでソースコードをハッキングしました。それはまだ動作しません= / –

0

completionist酒、「キーのマッピングを見つけることができなかったというエラーのためにpath '' "はRailsがアクションを作成しているようです。

この問題のために良い答えは、このSO疑問であります。how to post an object to Rails using RESTKit

2

は、例として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"]; 

置き換え、ルートパスでPOSTからRestKitを設定へ:

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

と:

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

今度は{"name"=>"data"}の代わりに{"person" => {"name"=>"data"}}が届きます。

は参考のため、ここでは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]; 
} 

それは巧妙なトリック[objectMapping inverseMapping]との両方setMappingsetSerializationMappingを行います。

関連する問題