将JSON从iOS发布到Rails 3.1(Stringify_keys错误)

我正试图通过json从iPhone应用程序在我的rails后端创建用户帐户。 以下是当前发布到服务器的内容:

Started POST "/patients" for 127.0.0.1 at 2011-11-27 20:52:29 -0800 Processing by PatientsController#create as HTML Parameters: {"patient"=>"{\"password\":\"password\",\"password_confirmation\":\"password\",\"email\":\"testagain\"}"} WARNING: Can't verify CSRF token authenticity Completed 500 Internal Server Error in 1ms NoMethodError (undefined method `stringify_keys' for #): app/controllers/patients_controller.rb:43:in `new' app/controllers/patients_controller.rb:43:in `create' 

通过直接从浏览器发布,这些是提交的参数:

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"H2iYdzdfokQs91AAozb+taMTdV2y5xLRaCni5XKQN4w=", "patient"=>{"email"=>"test", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Create Patient"} 

从我在别处读到的内容中,stringify_keys意味着操作需要一个哈希(我以为我几乎重建了),因为我使用这个代码来创建一个新用户:

 @patient = Patient.new(params[:patient]) 

我还认为,如果我使用JSON格式发布,真实性令牌无关紧要……这有关系吗?

总而言之:这是从iPhone应用程序发布到rails后端的正确方法吗? 重新创建参数哈希? 会欣赏正确方向的任何推动。

为了完整起见,这里是我用来从我的iOS应用程序发布的代码片段:

  NSDictionary *json = [self createSignUpDictionary]; NSURL *url = [NSURL URLWithString:@"http://localhost:3000/patients"]; ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; [request addRequestHeader:@"Content-Type" value:@"application/json"]; [request addRequestHeader:@"Accepts" value:@"application/json"]; [request setPostValue:[json JSONString] forKey:@"patient"]; [request startAsynchronous]; 

您很可能必须为您的操作禁用身份validation令牌validation。

只需将以下行放在您的控制器中,一切都应该有效。

 protect_from_forgery :except => :index 

但是,如果这样做,请确保在#create函数上有某种forms的自定义保护。 您可以阅读以获取更多信息: http : //api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html