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,但这解决了列出的问题。
我正在 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,但这解决了列出的问题。