我有点复杂的情况。我正在构建一个带有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/
这是最好的解决方案还是我错过了什么?
答案 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操作中寻找它。
但你的设置和思考看起来很好。