如何使用RestKit将对象发布到rails? [英] How to POST an object to rails using RestKit?

查看:113
本文介绍了如何使用RestKit将对象发布到rails?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正试图通过RestKit和Rails实现神奇。我正在使用Rails 3.1.1和RestKit 0.9.3(不是主分支)。我在我的iOS应用程序中使用Core Data,所以我正在尝试设置应用程序以尽可能多地使用RestKit魔法与rails应用程序进行交互。

I'm trying to make the magic happen with RestKit and Rails. I'm using Rails 3.1.1, and RestKit 0.9.3 (not the master branch). I am using Core Data in my iOS app, so I'm trying to setup the app to use as much RestKit magic as possible to interact with the rails app.

但是,我在尝试将新对象发布到要创建的服务器时遇到问题。我已经成功地把对象搞定了。这是我的代码:

However, I'm having a problem trying to POST a new object to my server to be created. I have successfully GET'ed the objects down. Here is my code to do that:

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

这似乎对我有用。现在,我想将一个新创建的对象POST回服务器。

That seems to be working well for me. Now, I want to POST a newly created object back to the server.

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

我用我想要新列表的名称来调用此方法。调用此方法,但是我收到此错误:

I call this method with the name I want the new list to have. This method is called, but I get this error:

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

我完成映射的尝试是:

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

(这给出了上述错误)。我知道有一种非常简单的方法可以做到这一点,但没有一个例子有这个代码,并且所有文档似乎都已过时了......你是否也必须将信息作为POST参数发送?感谢帮助,谢谢!

(That gives the above error). I know there is a pretty straightforward way to do this, but none of the examples have this code, and all the documentation seems out of date... Do you have to send the info as POST parameters as well? Help would be appreciated, Thank you!

更新

这是服务器响应 - 它有效,但它出现了参数有点搞砸了? (我输入的标题是:从iPhone 2制造!)

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)


推荐答案

我认为 inverseMapping 选择器应该足以进行序列化映射

I think the inverseMapping selector should be enough to make a serialization mapping

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

编辑:

根据我们的聊天对话,RestKit产生的警告是由服务器响应缺少根KeyPath(作为裸数组返回)引起的。要解决这个问题,我们需要告诉RestKit使用特定的映射来映射响应:

according to our chat conversation, the warnings produced by RestKit were caused by the fact that the server response was lacking the root KeyPath (returned as naked array). To solve the problem we need to tell RestKit to use specific mapping to map the response:

mapping = [[[RKObjectManager sharedManager] mappingProvider] mappingForKeyPath:@"list"];
[[RKObjectManager sharedManager] postObject:newList mapResponseWith:mapping delegate:self];

这篇关于如何使用RestKit将对象发布到rails?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆