我最近在一个项目中实施了Carrierwave,并使其适用于一种模型。我尝试将相同的代码扩展到另一个模型,由于某种原因,图像将无法保存。
两个模型表均在模式中为“文本”类型的“图像”列中。
两个模型的顶部都有以下几行:
mount_uploaders :images, ImageUploader
serialize :images, JSON
在两个控制器中我都有一个私有方法允许图像:
def images_param
params.require(:image_files).permit!
end
然后在两个控制器的#update动作中将图像添加到对象中:
object.images = images_param.values
object.save
byebug
让我感到困惑的是,这对于其中一个模型来说效果很好,但对其他模型却没有效果。而且,当我使用byebug来检查对象时,有效的模型将显示添加到该对象的图像,而另一个模型将图像显示为“ nil”。
这是对象 1 的(有效)byebug输出:
#<PageAppearance id: 10, images: ["image-1.png"]>
这是对象 1 .images的(有效)byebug输出:
[#<ImageUploader:0x00007f8bb5eb43d8 @model=#<PageAppearance id: 10, images: ["image-1.png"]>, @mounted_as=:images, @cache_id=nil, @filename="image-1.png", @original_filename="image-1.png", @file=#<CarrierWave::SanitizedFile:0x00007f8bb736d400 @file="/Users/agaus/environment/namc-portal_/public/uploads/page_appearance/images/10/image-1.png", @original_filename=nil, @content_type="image/png">, @cache_storage=#<CarrierWave::Storage::File:0x00007f8bb5eacd90 @uploader=#<ImageUploader:0x00007f8bb5eb43d8 ...>>, @versions={}, @storage=#<CarrierWave::Storage::File:0x00007f8bb1f8a888 @uploader=#<ImageUploader:0x00007f8bb5eb43d8 ...>>>]
>
这是对象 2 的(失败的)byebug输出:
#<Question id: 276, images: nil>
这是对象 2 。图像的(失败的)byebug输出:
[#<ImageUploader:0x00007f8bb80f7620 @model=#<Question id: 276, images: nil>, @mounted_as=:images, @storage=#<CarrierWave::Storage::File:0x00007f8bb80eb7d0 @uploader=#<ImageUploader:0x00007f8bb80f7620 ...>>>]
>
如果有人知道为什么会发生这种情况,我将不胜感激!
答案 0 :(得分:2)
因此,事实证明,我的 form 标记中没有将 enctype 设置为 multipart (通过表单上传文件时需要使用此代码) )。将<%= form_for @question do |f| %>
更改为<%= form_for @question, html: {multipart: true} do |f| %>
可以解决此问题。