Ruby on rails 回形针在更新时删除现有附件
AR型号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 当更新帖子时,赞助商也会以嵌套形式更新 但当用户不选择任何图像进行更新时,回形针会删除现有的附件 如果用户在更新记
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
的任何值
对此的警告是,如果您正在更新图像以外的内容(我看到您有
:描述性文本,:徽标,:名称,:网站,:说明)
在这种情况下,您需要将适当的数据传递给您的赞助商
模型(即nologo
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