使用Rails创建嵌套的JSON请求

我有点复杂的情况。 我正在构建一个带有rails后端的iPhone应用程序。 有两个模型对象,一个聊天会话和一个人。 它们的定义如下:

class Person < ActiveRecord::Base belongs_to :chatsession end class Chatsession  "Person" end 

领导者本质上是特定聊天会话的主要人物。 现在,从我的iPhone应用程序中,我希望能够在一次调用中与领导者创建一个Chatsession(通常网络调用在iPhone上很昂贵,所以我想避免创建一个Person对象,然后创建一个会话对象)。

可能的JSON请求可能如下所示:

 {"chatsession": {"leader": {"name":"mary","device_id":"1111"}}} 

在我创建方法的chatsession控制器上,我希望能够吸入这个JSON并让它创建一个新的聊天会话对象和相关的人物对象。

执行此操作的相关代码将是:

 class ChatsessionController < ApplicationController def create @chatsession = Chatsession.new(params[:chatsession]) end 

在我的function测试中,它使用以下代码:

  test "should create session" do # people(:one) is retrieving from a fixture post :create, :chatsession => { :leader => people(:one) } assert_response :success end 

这很好用。 但是创建等效的json似乎不起作用。 它期待某种Person对象,我不知道如何表示。 我已经看过以下解决问题的方法。

http://www.rogue-development.com/blog2/2009/05/creating-nested-objects-with-json-in-rails/

这是最好的解决方案还是我错过了什么?

这篇文章看起来像是一个很好的解决方案。

你遇到哪个问题?

Rails 2.1及更高版本自动处理传入的JSON请求。 只需确保您的iPhone应用程序将mime类型设置为json。 请参阅post ,其中还讨论了在post中测试传入的JSON。

几个指针:

  • 确保将“Content-Type”和“Accept”标题都设置为“application / json”。 通过查看/记录你的参数来测试这个; 如果它们都设置正确,那么你很高兴。

  • 我想你想在聊天会话中有一个accepts_nested_attributes_for :leader

  • 您可能需要绕过真实性令牌; 你的iPhone不会发送它,默认情况下rails会在post / put操作中寻找它。

但你的设置和思考看起来很好。