【问题标题】:Creating a nested JSON request with Rails使用 Rails 创建嵌套的 JSON 请求
【发布时间】:2010-08-20 01:15:47
【问题描述】:

我的情况有点复杂。我正在构建一个带有 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 应用程序中,我希望能够在一次通话中与领导者创建聊天会话(通常网络通话在 iPhone 上很昂贵,因此我想避免创建一个 Person 对象,然后创建一个会话对象)。

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

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

在我的聊天会话控制器的 create 方法中,我希望能够吸入这个 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/

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

【问题讨论】:

    标签: ruby-on-rails json associations


    【解决方案1】:

    这篇文章对我来说是一个很好的解决方案。

    你在哪个部分遇到了问题?

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

    【讨论】:

    • 感谢您的链接。我最终接受了这些建议并且效果很好。我试图避免使用accepts_nested_attributes,因为我想尝试让我的东西与objectiveresouce(一个iphone activeresource 端口)一起工作。无论如何,它看起来不像objectiveresource 处理嵌套,所以我将推出我自己的JSON 序列化。谢谢!
    【解决方案2】:

    几个指针:

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

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

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

    但是你的设置和想法看起来不错。

    【讨论】:

    • 感谢您提供有关真实性令牌以及设置接受标头的提示。
    猜你喜欢
    • 1970-01-01
    • 2014-10-21
    • 2012-11-04
    • 2017-09-07
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多