当前位置: 首页 > 面试题库 >

在Rails中使用JSON创建嵌套对象

葛承教
2023-03-14
问题内容

如何将JSON传递到RAILS应用程序,以便它将以has_many关系创建嵌套的子对象?

这是我到目前为止的内容:

两个模型对象。

class Commute < ActiveRecord::Base
  has_many :locations
  accepts_nested_attributes_for :locations, :allow_destroy => true
end

class Location < ActiveRecord::Base
  belongs_to :commute
end

使用通勤,我可以设置标准控制器。我希望能够使用JSON在一个REST调用中创建一个Commute对象以及几个子Location对象。我一直在尝试这样的事情:

curl -H "Content-Type:application/json" -H "Accept:application/json" 
-d "{\"commute\":{\"minutes\":0, 
\"startTime\":\"Wed May 06 22:14:12 EDT 2009\", 
\"locations\":[{\"latitude\":\"40.4220061\",
\"longitude\":\"40.4220061\"}]}}"  http://localhost:3000/commutes

更具可读性的JSON是:

{
    "commute": {
        "minutes": 0,
        "startTime": "Wed May 06 22:14:12 EDT 2009",
        "locations": [
            {
                "latitude": "40.4220061",
                "longitude": "40.4220061"
            }
        ]
    }
}

执行该命令时,将得到以下输出:

Processing CommutesController#create (for 127.0.0.1 at 2009-05-10 09:48:04) [POST]
  Parameters: {"commute"=>{"minutes"=>0, "locations"=>[{"latitude"=>"40.4220061", "longitude"=>"40.4220061"}], "startTime"=>"Wed May 06 22:14:12 EDT 2009"}}

ActiveRecord::AssociationTypeMismatch (Location(#19300550) expected, got HashWithIndifferentAccess(#2654720)):
  app/controllers/commutes_controller.rb:46:in `new'
  app/controllers/commutes_controller.rb:46:in `create'

看起来好像正在读取JSON数组的location,但没有解释为Location对象。

我可以轻松更改客户端或服务器,因此解决方案可以来自任何一方。

那么,RAILS是否使我容易做到这一点?还是我需要在Commute对象中添加一些对此的支持?也许添加一个from_json方法?

谢谢你的帮助。

在进行此操作时,一种可行的解决方案是修改控制器。但这似乎不是实现此目标的“方法”,所以请让我知道是否有更好的方法。

def create
    locations = params[:commute].delete("locations");
    @commute = Commute.new(params[:commute])

    result = @commute.save

    if locations 
      locations.each do |location|
        @commute.locations.create(location)
      end
    end


    respond_to do |format|
      if result
        flash[:notice] = 'Commute was successfully created.'
        format.html { redirect_to(@commute) }
        format.xml  { render :xml => @commute, :status => :created, :location => @commute }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @commute.errors, :status => :unprocessable_entity }
      end
    end
  end

问题答案:

解决了这个问题,应该将locations对象称为locations_attributes,以与Rails嵌套对象创建命名方案匹配。之后,它可以与默认的Rails控制器完美配合。

{
    "commute": {
        "minutes": 0,
        "startTime": "Wed May 06 22:14:12 EDT 2009",
        "locations_attributes": [
            {
                "latitude": "40.4220061",
                "longitude": "40.4220061"
            }
        ]
    }
}


 类似资料:
  • 问题内容: 我不太使用php,并且在对象创建方面有些模糊。我需要发出一个发送json的网络服务请求,我想我已经覆盖了那部分。在提交数据之前,我需要创建一个嵌套对象。根据我对基于ecma的脚本语言的经验,我认为这是微不足道的,但是我发现该语法难以导航。我要创建的对象如下。 我已经看到了许多平面对象的示例,但是还没有找到嵌套对象的最小示例。上面对象的php语法是什么?这是在PHP中做的不寻常的事情吗?

  • 问题内容: 说我要制作以下JSON 目前,这就是我实现的方式 似乎应该有一个更好的方法来做到这一点,而不是做更多的事情,然后将它们放置在主体中。有比我正在使用的方法更好的动态构建方法吗? 在此先感谢您的帮助! 问题答案: 如果您处理大量JSON数据,我真的建议您使用Gson或Jackson。这要方便得多,并且两个库都很好地支持与Java对象之间的相互转换(与通过JSONObjects手动构建JSO

  • 问题内容: 我有三种模式: 我想获取包含A的所有B和C的json数据。我尝试了许多类似的操作: 但没有任何效果。什么是做到这一点的好方法。 问题答案: 请参阅以查看可以传递给的选项。报价: 要包括关联,请使用… 二级和更高级别的关联也可以工作: 不需要像自动那样直接调用或直接调用。

  • 本文向大家介绍PHP 中如何创建嵌套 JSON 对象,包括了PHP 中如何创建嵌套 JSON 对象的使用技巧和注意事项,需要的朋友参考一下 JSON结构可以使用以下代码创建-

  • 问题内容: 我想使用JSONObject和JSONArray构建类似于遵循Java中的结构的JSON对象。 我已经遍历了堆栈溢出中的各种帖子,建议使用诸如push,put等无法识别JSONArray的方法。请帮忙。 问题答案: 与进口和 为了清楚起见,我没有包括第一个数组的第二个元素。希望你明白了。 编辑: 先前的答案是假设您正在使用和。 对于和: 基本上是相同的,在JSONObject中将方法’

  • 问题内容: 我想使用JSONObject和JSONArray构建类似于遵循Java中的结构的JSON对象。 我已经遍历了堆栈溢出中的各种帖子,这建议使用无法识别JSONArray的方法,例如push,put等。请帮忙。 问题答案: 与进口和 为了清楚起见,我没有包括第一个数组的第二个元素。希望你明白了。 编辑: 先前的答案是假设您正在使用和。 对于和: 基本上是相同的,在JSONObject中将方