Rails 5 API - 父 'must exist' 尝试通过 POST 创建子记录时出错

Rails 5 API - parent 'must exist' error when trying to create a child record via POST

我正在 Rails 5 中构建我的第一个 API(有史以来)作为学习经验。

我在 --api 模式下使用 Rails 并安装了 active_model_serializers gem。

API是基于船舶与航程之间的关系。

一艘船 has_many :航程和航程 belongs_to :ship.

使用 Postman 检查航程 API 端点我得到这个作为 return 值:

{
  "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 使用键创建新航程时: voyage[ship][id] 值:1 我从 API 中得到一个 return 'must exist'

我从 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)

我们将不胜感激任何帮助。

如果您已经有了船的 id,那么您必须将其作为 ship_id 而不是 ship[id] 发送。您的参数应如下所示,

{ "voyage"=> { "ship_id" => "1", "year" => "4" } }

我在创建新的 object 时也看到了这个问题,但没有符合 parent 的条件,例如:

@obj = SomeObjectType.where(:some_parent_id => params[:some_parent_id]).first_or_create
@obj.save!

如果 SomeObjectType 有多个 parent,例如一个用户,这将以同样的方式出错,在大多数示例中通常是通过以下方式创建的:

@obj = User.find_by_id(params[:user_id]).objs.new(obj_params)
@obj.save!

在第一种出错的情况下,您必须通过 belongs_to 关系分配用户(或任何 parent 出错):

 @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!

可能有更简洁的方法来关联这些 parent,但这解决了列出的问题。