Rails API: 通过postman发送嵌套资源请求

Rails API: send request with nested resources through postman

我创建了一个仅 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

现在,当我尝试使用邮递员发布的参数创建新的 Book 时,

{
    "book": {
        "name": "Angels and Demons",
        "isbn": "12323012123213",
        "authors_attributes": [{"id": 1}, {"id": 2}]
    }
}

它给我以下错误:尽管 ID 为 1 的作者存在于数据库中。

"message": "Couldn't find Author with ID=1 for Book with ID="

如果我像下面这样更改我的表单参数:

{
    "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

知道我做错了什么吗?

如果您想将一本书与现有作者相关联,则不需要嵌套属性 - 只需将 ID 数组传递为 book_ids:

{
    "book": {
        "name": "Angels and Demons",
        "isbn": "12323012123213",
        "author_ids": [1,2]
    }
}

ActiveRecord 将为所有 has_many 和 HABTM 关联创建 *association_name*_ids getter 和 setter。

仅当关联记录需要在同一请求中即时 created/updated 时才使用嵌套属性。对于 API 应用程序,我会避免嵌套属性,因为您最终会弯曲 Single Responsibility Principle.