我们的Attachment模型(在本例中用于与团队关联的徽标)在将其关联到团队之前保存到数据库中。我们这样做是因为我们进行客户端S3上传,因此我们需要生成S3密钥并在将其与数据库中的另一个模型关联之前进行确认。
团队模型引用附件类,如下所示:
Class Team < ApplicationRecord
has_many :logos, as: :attachable, class_name: "Attachment", dependent: :destroy, after_add: :cache_logo_url, inverse_of: :attachable
accepts_nested_attributes_for :logos, allow_destroy: true
end
字符串
Attachment类引用多态的可附加对象,如下所示:
class Attachment < ApplicationRecord
belongs_to :attachable, polymorphic: true, optional: true
end
型
在控制器中,我们接受嵌套的属性:
class Api::V1::TeamsController < Api::V1::BaseController
def update
@team = Team.find(params[:id])
authorize @team
if @team.update(params)
render status: :no_content
else
validation_error(@team.errors)
end
end
private
def team_params
params.require(:team).permit(
:name,
logos_attributes: [:id, :_destroy]
)
end
end
型
但是当PUT出现时,我们得到:
实际上,Rails找不到该附件,因为在ID为1021的附件上没有设置attachable。
我想要的是Rails根据ID(并且仅基于ID)找到附件,然后将其与团队相关联。
在这种情况下,接受嵌套属性应该如何工作,我是否错过了一些明显的东西?
1条答案
按热度按时间9njqaruj1#
等待更多的信息,但在此期间,我认为你可能只想像这样传递参数:
字符串
Rails应该理解logo_ids的传递,因为它在模型中有has_many和accepts_nested_attributes_for。
Rails在这些上下文中理解
..._ids
。所以你应该能够在控制台上说:型
它将查找这些徽标并尝试在保存时附加它们。您也可以调用
@team.logo_ids
,它将返回附加徽标ID的数组。