如何将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中将方