我的目标是通过一个REST请求创建嵌套的资源。 REST请求通过XML文档表示。这对单个资源来说工作正常,但我无法管理它嵌套的资源。好的,接下来我会给你一个小例子。如何在XML中使用嵌套资源来使用REST?
首先创建一个新的Rails项目
rails forrest
接下来我们产生两个资源,树木和燕窝的支架。
./script/generate scaffold tree name:string
./script/generate scaffold bird_nest tree_id:integer bird_type:string eggs_count:integer
在./forrest/app/models/tree.rb我们下面插入,因为一棵树可以有很多鸟的巢“的has_many”行的文件:-)
class Tree < ActiveRecord::Base
has_many :bird_nests
end
在文件./forrest/app/models/bird_nest.rb我们在下面插入“belongs_to”这一行,因为每个鸟巢都应该属于一棵树。
class BirdNest < ActiveRecord::Base
belongs_to :tree
end
后来我们建立数据库并启动服务器:
rake db:create
rake db:migrate
./script/server
只需复制并粘贴此XML sniplet到一个名为 “tree.xml” 文件...
<tree>
<name>Apple</name>
</tree>
...并通过cURL将其发布到服务以创建新树:
curl -H 'Content-type: application/xml' -H 'Accept: application/xml' -d @tree.xml http://localhost:3000/trees/ -X POST
这工作正常。另外为鸟巢XML(文件名“bird-nest.xml”)分开。如果我们发送此...
<bird-nest>
<tree-id>1</tree-id>
<bird-type>Sparrow</bird-type>
<eggs-count>2</eggs-count>
</bird-nest>
...也通过以下cURL语句。该资源已正确创建!
curl -H 'Content-type: application/xml' -H 'Accept: application/xml' -d @bird-nest.xml http://localhost:3000/bird_nests/ -X POST
确定一切都很好。现在来到橡胶与路面相遇的地方。我们在一个请求中创建两个资源。因此,这里是包含一个鸟巢为我们的树中的XML:
<tree>
<name>Cherry</name>
<bird-nests>
<bird-nest>
<bird-type>Blackbird</bird-type>
<eggs-count>2</eggs-count>
</bird-nest>
</bird-nests>
</tree>
我们触发相应的请求通过卷曲再次使用...
curl -H 'Content-type: application/xml' -H 'Accept: application/xml' -d @tree-and-bird_nest.xml http://localhost:3000/trees/ -X POST
...现在我们会得到一个在(生成)“创造”树的控制器的方法,服务器错误:AssociationTypeMismatch(燕窝预期,得到了阵列)
在我的角度来看,这是服务器的日志中关于接收的属性和错误MESSA的重要组成部分ge:
Processing TreesController#create (for 127.0.0.1 at 2009-02-17 11:29:20) [POST]
Session ID: 8373b8df7629332d4e251a18e844c7f9
Parameters: {"action"=>"create", "controller"=>"trees", "tree"=>{"name"=>"Cherry", "bird_nests"=>{"bird_nest"=>{"bird_type"=>"Blackbird", "eggs_count"=>"2"}}}}
SQL (0.000082) SET NAMES 'utf8'
SQL (0.000051) SET SQL_AUTO_IS_NULL=0
Tree Columns (0.000544) SHOW FIELDS FROM `trees`
ActiveRecord::AssociationTypeMismatch (BirdNest expected, got Array):
/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:150:in `raise_on_type_mismatch'
/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:146:in `replace'
/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:146:in `each'
/vendor/rails/activerecord/lib/active_record/associations/association_collection.rb:146:in `replace'
/vendor/rails/activerecord/lib/active_record/associations.rb:1048:in `bird_nests='
/vendor/rails/activerecord/lib/active_record/base.rb:2117:in `send'
/vendor/rails/activerecord/lib/active_record/base.rb:2117:in `attributes='
/vendor/rails/activerecord/lib/active_record/base.rb:2116:in `each'
/vendor/rails/activerecord/lib/active_record/base.rb:2116:in `attributes='
/vendor/rails/activerecord/lib/active_record/base.rb:1926:in `initialize'
/app/controllers/trees_controller.rb:43:in `new'
/app/controllers/trees_controller.rb:43:in `create'
所以我的问题是我做错了关于嵌套的XML资源。这将是正确的XML语法?或者是否必须手动修改树的控制器,因为这种情况不在生成的范围内?
看起来您可能需要编辑TreesController创建操作来处理创建BirdsNest对象。您可以发布TreesController创建操作的副本吗? – hernan43 2009-02-17 12:45:35
创建操作是之前步骤中生成的默认操作(请参阅“生成脚手架”)。 – 2009-02-17 14:04:47