iOS POST 到 Rails - 参数不包含 :modelname 的值

标签 ios ruby-on-rails-3 cocoa-touch asiformdatarequest

我有一个可以响应 HTML 和 JSON 客户端请求的 rails 3 Controller 。这个 Controller 有一个“create”方法,它创建一个新的“用户”模型对象,其值发布在 params[:user] 中。当用户参数值从 HTML 表单发布时,这将按预期工作。但是,当从 JSON 客户端(在我的情况下为 iOS)发布到此操作时,params[:user] 为 nil;我确实注意到,如果直接访问 params 哈希确实包含正确的值,即 params[:username] => "someusername"

我需要在 HTTP 请求中添加什么内容,以便可以在 Controller 中使用 params[:model_name] 语法吗?我正在使用 ASIFormDataRequest.m 发布到我的 Rails 应用程序。

我的客户端 POST 如下所示:

-(void)createUser:(NSString *)first
     lastName:(NSString *)last
     userName:(NSString *)user
        email:(NSString *)email
     password:(NSString *)password{

NSString *stringFormat = [NSString stringWithFormat:@"%@users.json", serviceBaseURL];
NSURL *url = [NSURL URLWithString:stringFormat];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
User *requestedUser = [[User alloc]initWithId:nil firstName:first lastName:last userName:user email:email password:password];
request.tag = CREATE_USER;
request.userInfo = [NSDictionary dictionaryWithObject:requestedUser forKey:@"requestedUser"];
[request setPostValue:first forKey:@"first_name"];
[request setPostValue:last forKey:@"last_name"];
[request setPostValue:user forKey:@"username"];
[request setPostValue:email forKey:@"email"];
[request setPostValue:password forKey:@"password"];
request.Delegate = self;
[request startAsynchronous];

}

Controller 的“创建”方法如下所示:
 def create
  @user = User.new(params[:user])      
  if @user.save  #This will fail because params[:user] is nil when posted from iOS!
    flash[:notice] = {:success => "User Created."}
    session[:user_id] = @user.id
        session[:username] = @user.username
         respond_to do |format|
            format.json {render :json => @user}
            format.html{redirect_to(:controller => 'lists', :action => 'index')}
         end

  else
     flash[:notice] = {:error => @user.errors}
      respond_to do |format|
         #format.json {render :json => @user.errors}
         format.json {render :json => params[:username]} #This has a value. So the form parameters are sent.
         format.html{render('new')}
      end
  end
end

最佳答案

问题是我需要以 RoR 期望的格式发布我的 JSON。 POST 数据的格式如下:

{first_name: "somename", last_name: "somelastname", username: "someusername", etc...}

我的 RoR Controller 期望将属性包装在模型对象中,如下所示:
{user:{first_name: "somename", last_name: "somelastname", username: "someusername", etc...}}

使用 ASIFormDataRequest 这可以通过格式化您的 post 参数来完成,如下所示:
[request setPostValue:first forKey:@"user[first_name]"];
[request setPostValue:last forKey:@"user[last_name]"];
[request setPostValue:user forKey:@"user[username]"];
[request setPostValue:email forKey:@"user[email]"];
[request setPostValue:password forKey:@"user[password]"];

注意'model_name[parameter]' 格式。

关于iOS POST 到 Rails - 参数不包含 :modelname 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13576476/

相关文章:

ios - Facebook 和 Path 是否在其根导航 UI 中使用开源库?

ruby-on-rails-3 - Kaminari 不起作用如果我的查询在模型中

linux - 无法在 Linux 中运行具有 RAILS bundle 命令的 cronjob(.sh 文件)

iphone - 内存泄漏如下代码

ios - 注册 GPX(或 XML)文件以在 iOS 应用程序中打开

ios - 如何使用 Swift CoreData 删除表中的特定行

ios - 在 IOS 上将 CoreGraphics 渲染为 OpenGL 纹理

ruby-on-rails - 测试多个变量是否小于一个值的 Ruby 方法

iphone - 如何将 UITextField 的值转换为 NSNumber?

ios - 在 parse.com 上存储消息传递应用程序的发送消息历史记录?