Rails 5 API - 尝试通过POST创建子记录时,父“必须存在”错误

时间:2016-07-28 10:08:34

标签: ruby-on-rails ruby ruby-on-rails-5 active-model-serializers

我正在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)

非常感谢任何和所有帮助。

2 个答案:

答案 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!

可能有一种更简洁的方式来关联这些父母,但这解决了列出的问题。