Rails API:通过邮递员发送嵌套资源请求

时间:2018-04-03 09:09:19

标签: ruby-on-rails postman nested-forms

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

知道我做错了吗?

1 个答案:

答案 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