ruby Rails accepts_nested_attributes_for无法关联(或查找)传入的记录

cl25kdpy  于 11个月前  发布在  Ruby
关注(0)|答案(1)|浏览(150)

我们的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)找到附件,然后将其与团队相关联。
在这种情况下,接受嵌套属性应该如何工作,我是否错过了一些明显的东西?

9njqaruj

9njqaruj1#

等待更多的信息,但在此期间,我认为你可能只想像这样传递参数:

params: {"teams"=>{logo_ids[1,2,3]}}

字符串
Rails应该理解logo_ids的传递,因为它在模型中有has_many和accepts_nested_attributes_for。
Rails在这些上下文中理解..._ids。所以你应该能够在控制台上说:

@team.logo_ids = [1,2,3]


它将查找这些徽标并尝试在保存时附加它们。您也可以调用@team.logo_ids,它将返回附加徽标ID的数组。

相关问题