使用Carrierwave或Paperclip时,一切都按预期工作,但编辑/更新除外。当存在记录的图像或文件时,如果您没有明确上传其他文件,则在保存时将其设置为nil。
我一直在寻找但尚未找到的解决方案,允许更新其他表单字段但保留现有文件。当然,除非文件也更新。
我的设置是使用嵌套模型,因此对于Carrierwave和Paperclip我都尝试了以下方法,但没有成功。
显然我错过了一些东西,但我不能为我的生活弄清楚是什么。
非常感谢任何帮助。
答案 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不起作用。如果我有时间,我会切换并报告。