我的目标是通过一个REST请求创建嵌套资源.REST请求通过XML文档表示.这适用于单个资源,但我无法管理嵌套的资源.好的我接下来会给你一个小例子.
首先创建一个新的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
在File ./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片段复制并粘贴到名为"tree.xml"的文件中即可...
Apple
...并通过cURL将其发布到服务以创建新树:
curl -H 'Content-type: application/xml' -H 'Accept: application/xml' -d @tree.xml http://localhost:3000/trees/ -X POST
这很好用.也用于鸟巢XML(文件名"bird-nest.xml").如果我们发送这个......
1 Sparrow 2
...也可以通过以下cURL声明.该资源正确创建!
curl -H 'Content-type: application/xml' -H 'Accept: application/xml' -d @bird-nest.xml http://localhost:3000/bird_nests/ -X POST
好的到目前为止一切都很好.现在,橡胶遇到了道路.我们在一个请求中创建两个资源.所以这里是我们树的XML,它包含一个鸟巢:
Cherry Blackbird 2
我们再次使用cURL触发相应的请求...
curl -H 'Content-type: application/xml' -H 'Accept: application/xml' -d @tree-and-bird_nest.xml http://localhost:3000/trees/ -X POST
...现在我们将在树的控制器的(生成的)"create"方法中得到服务器错误:AssociationTypeMismatch(BirdNest expected,got Array)
在我看来,这是服务器日志中关于接收属性和错误消息的重要部分:
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语法?或者我是否必须手动修改树的控制器,因为生成的情况不包括这种情况?