使用Rails创建嵌套的JSON请求

时间:2010-08-20 01:15:48

标签: ruby-on-rails json associations

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

class Person < ActiveRecord::Base
belongs_to :chatsession
end


class Chatsession < ActiveRecord::Base
has_many :people
belongs_to :leader, :class_name => "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

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

 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/

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

2 个答案:

答案 0 :(得分:2)

该帖子对我来说是一个很好的解决方案。

你遇到了哪些问题?

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

答案 1 :(得分:1)

指点:

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

  • 我想您想在聊天会话中使用accepts_nested_attributes_for :leader

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

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