我创建了一个仅限rails api的应用程序。模型之间的关联如下:
class Book < ApplicationRecord
has_and_belongs_to_many :authors
accepts_nested_attributes_for :authors, allow_destroy: true
end
class Author < ApplicationRecord
has_and_belongs_to_many :books
end
现在,当我尝试使用postman发布的参数创建新的Book
时,
{
"book": {
"name": "Angels and Demons",
"isbn": "12323012123213",
"authors_attributes": [{"id": 1}, {"id": 2}]
}
}
它给出了以下错误:虽然DB中存在ID为1的作者。
&#34;消息&#34;:&#34;无法找到ID = 1的作者,ID为&#34;
如果我更改了以下表单参数:
{
"book": {
"name": "Angels and Demons",
"isbn": "12323012123213",
"authors_attributes": [{"0": {"id": 1}}, {"1": {"id": 2}}]
}
}
它给出了Author
模型的验证错误。
控制器强参数:
def book_params
params.require(:book).permit(:name, :isbn, authors_attributes: [:id, :_destroy])
end
知道我做错了吗?
答案 0 :(得分:0)
如果您想将图书与现有作者相关联,则不需要嵌套属性 - 只需将book_ids
作为一组ID传递:
{
"book": {
"name": "Angels and Demons",
"isbn": "12323012123213",
"author_ids": [1,2]
}
}
ActiveRecord将为所有*association_name*_ids
和HABTM关联创建has_many
个getter和setter。
仅当需要在同一请求中即时创建/更新关联记录时,才使用嵌套属性。对于API应用程序,我会避免使用嵌套属性,因为您最终会弯曲Single Responsibility Principle。