我正在Rails 5中构建我的第一个API(曾经)作为一种学习体验。
我在--api模式下使用Rails并安装了active_model_serializers gem。
API基于船舶与航行之间的关系。
一艘船has_many:航程和航程belongs_to:ship。
使用Postman检查航程API端点我将其作为返回值:
{
"id": 1,
"tstd_id": 94583,
"year": 1722,
"began": null,
"trade_began": null,
"departed_africa": null,
"arrived_slaves": null,
"ended": null,
"length": null,
"middle_passage_length": null,
"port_departed": "Liverpool",
"ship": {
"id": 1,
"name": "Mary",
"flag": "British",
"rig": null,
"tonnage": null,
"standardized_tonnage": null,
"year_constructed": null,
"place_registered": null,
"year_registered": null,
"from": null,
"to": null
}
}
当我尝试通过POST使用Key创建新的航程时:voyage [ship] [id]值:1我从“必须存在”的API返回
我从Rails控制台获得的错误是:
Started POST "/voyages" for 127.0.0.1 at 2016-07-28 11:03:47 +0100
Processing by VoyagesController#create as */*
Parameters: {"voyage"=>{"ship"=>{"id"=>"1"}, "year"=>"4"}}
Unpermitted parameter: ship
(0.2ms) begin transaction
(0.1ms) rollback transaction
[active_model_serializers] Rendered ActiveModel::Serializer::Null with ActiveModel::Errors (0.14ms)
Completed 422 Unprocessable Entity in 9ms (Views: 0.9ms | ActiveRecord: 0.4ms)
非常感谢任何和所有帮助。
答案 0 :(得分:1)
如果您已经随身携带id
,那么您必须将其作为ship_id
而不是ship[id]
发送。您的参数应如下所示,
{ "voyage"=> { "ship_id" => "1", "year" => "4" } }
答案 1 :(得分:0)
在没有父母资格的情况下创建新对象时,我也看到了这个问题,例如:
@obj = SomeObjectType.where(:some_parent_id => params[:some_parent_id]).first_or_create
@obj.save!
如果SomeObjectType具有多个父对象(例如用户),则会以相同的方式出错,这通常在大多数示例中以下列方式创建:
@obj = User.find_by_id(params[:user_id]).objs.new(obj_params)
@obj.save!
在第一种错误的情况下,您必须通过belongs_to关系分配用户(或任何父级错误):
@obj = SomeObjectType.where(:some_parent_id => params[:some_parent_id]).first_or_create
@user = User.find_by_id(params[:user_id]);
@obj.user = @user
@obj.save!
可能有一种更简洁的方式来关联这些父母,但这解决了列出的问题。