Ruby on rails 回形针在更新时删除现有附件

Ruby on rails 回形针在更新时删除现有附件,ruby-on-rails,file-upload,paperclip,Ruby On Rails,File Upload,Paperclip,AR型号 class Post < ActiveRecord::Base has_one :sponsor accepts_nested_attributes_for :sponsor end class Sponsor < ActiveRecord::Base has_attached_file :logo belongs_to :post end 当更新帖子时,赞助商也会以嵌套形式更新 但当用户不选择任何图像进行更新时,回形针会删除现有的附件 如果用户在更新记

AR型号

class Post < ActiveRecord::Base
  has_one :sponsor
  accepts_nested_attributes_for :sponsor
end

class Sponsor < ActiveRecord::Base
  has_attached_file :logo
  belongs_to :post
end
当更新
帖子时,赞助商也会以嵌套形式更新

但当用户不选择任何图像进行更新时,回形针会删除现有的附件

如果用户在更新记录时未选择“其他”,我们如何保留现有附件

accepts_nested_attributes_for :sponsor, reject_if: :all_blank

你的问题是,不幸的是,回形针在接受数据时实际上相当“愚蠢”

当许多人向回形针发送相关数据时,回形针基本上会获取所提供的数据并从中构建对象。在你的情况下,这意味着你正在发送空白对象,引导纸夹替换现有的与空白的附件。

reject\u if
开关接受
就是解决这个问题的方法——它允许您指定Rails将“拒绝”任何嵌套数据的任何情况,保留您拥有的文件

如果

允许您指定一个
Proc
或一个
符号
,该符号指向一个方法,该方法检查是否应为某个属性哈希生成记录

散列被传递给提供的进程或方法,它应该返回true或false。当否
:拒绝\u如果指定了
,则将为没有计算为true的_destroy值的所有属性哈希生成一条记录

传递
:所有\u blank
而不是
过程
将创建一个过程,该过程将拒绝所有属性都为空的记录,不包括
\u destroy
的任何值


对此的警告是,如果您正在更新图像以外的内容(我看到您有
:描述性文本
:徽标
:名称
:网站
:说明

在这种情况下,您需要将适当的数据传递给您的
赞助商
模型(即no
logo
param):

我相信有更好的方法来实现这一点,但现在,上面的内容应该足够了


参考资料:


它可以工作。谢谢。你救了我一天。我对你答案中的post_params
方法做了一些修改,使之生效。
accepts_nested_attributes_for :sponsor, reject_if: :all_blank
def post_params
   sponsor_params = [:id, :descriptive_text, :logo, :name, :website, :description]
   sponsor_params -= [:logo] if (action_name == "update") && !params[:post][:sponsor_attributes][:logo]

   params.require(:post).permit(:title, :content, sponsor_attributes: sponsor_params)
end