Carrierwave或Paperclip:更新其他表单字段时保留图像/文件

时间:2015-04-22 23:45:40

标签: ruby-on-rails paperclip carrierwave nested-forms

使用Carrierwave或Paperclip时,一切都按预期工作,但编辑/更新除外。当存在记录的图像或文件时,如果您没有明确上传其他文件,则在保存时将其设置为nil。

我一直在寻找但尚未找到的解决方案,允许更新其他表单字段但保留现有文件。当然,除非文件也更新。

我的设置是使用嵌套模型,因此对于Carrierwave和Paperclip我都尝试了以下方法,但没有成功。

https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-keep-%28not-replace%29-files-on-nested-edits

显然我错过了一些东西,但我不能为我的生活弄清楚是什么。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我将Paperclip与nested_form一起使用,并且它很直接,没有任何意外。

您确定要检查您的嵌套记录是新记录还是已存在?您只想显示file_field,如果它实际上是新记录,否则显示图像(或除file_field之外的任何内容)。不过,您的链接已经解释过了。

另外你可以在提交时发布哪些参数 - 检查你的日志来做到这一点。

答案 1 :(得分:1)

好的,所以经过一些挖掘撬后我找到了解决方案。首先,这是设置。

模特

class Machine < ActiveRecord::Base
  has_many :parts
  accepts_nested_attributes_for :parts
end

class Part < ActiveRecord::Base
  belongs_to :machine
end

表格

= simple_form_for @machine do |m|
  ..... A bunch of inputs left out for brevity...
  = m.simple_fields_for :parts do |p|
    = p.input :name
    = p.input :location
    = p.input :price
    = p.file_field :image

在原始机器控制器中 - machine_posting_params

def machine_posting_params
    params.require(:machine).permit(:name, part_attributes: [:name, :location, :price, :image])
end

在工作机器控制器中 - machine_posting_params

def machine_posting_params
    params.require(:machine).permit(:name, part_attributes: [:name, :location, :price, :image, :id])
end

我找不到任何文档的问题是:我相信,id会被传递到part_attributes中。当part_attributes没有考虑它时,它会导致carrierwave在更新时转储图像引用。

因此,如果你有一个嵌套的表单并且你的图像在更新时不断消失,请尝试将:id添加到xxxxx_attributs。它适用于Carrierwave,但我认为没有理由这对Paperclip不起作用。如果我有时间,我会切换并报告。