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