我已安装了carrierwave gem用于图片上传。我需要将mount_uploader :value, CheckItemValueImageUploader
应用于values
,value_type
等于3
。这是我尝试过的。
下面的代码不会抛出任何错误,它似乎也没有任何区别,好像if语句不存在。
mount_uploader :value, CheckItemValueImageUploader, if: 'value_type == 3'
我尝试了下面的代码,该代码适用于非图像类型(除{3}之外的任何value_type
),但将图像保存为#<ActionDispatch::Http::UploadedFile:0x007fe74b2e2e28>
而不是image-name.png
if :value_type == 3
mount_uploader :value, CheckItemValueImageUploader
else
end
我也试过这个,这也像第一次尝试一样被忽略,好像if条件甚至没有被应用
mount_uploader :value, CheckItemValueImageUploader, if: :image?
def image?
self.value_type == 3
end
通过它自己没有任何if语句mount_uploader :value, CheckItemValueImageUploader
保存图像就好了,但任何其他值类型都不保存(例如文本),if语句应该解决这个问题。我不知道为什么第二个选项不起作用,但我确定它的一些随机原因超出了我在轨道上的知识范围。我真的希望有人在这里有一个有效的解决方案。
答案 0 :(得分:1)
通常你应该使用一个块:
mount_uploader :value, CheckItemValueImageUploader, if: proc { |o| o.value_type == 3 }
其中o
是模型的实例。
但是将signle字段用于各种目的的正确方法是使用STI,因此您将拥有表的单个父类和各种情况的子类:
应用/模型/ base_model.rb 强>:
class BaseModel < AR::Base
end
应用/模型/ base_models / pic.rb 强>:
class Pic < BaseModel
mount_uploader :value, CheckItemValueImageUploader # value as an image
end
应用/模型/ base_models / text.rb 强>:
class Text < BaseModel
# value as a string
end
注意您必须将type
字段添加到base_models
表格。
答案 1 :(得分:0)
我在 mount_uploader 方法文档中找不到对 if:选项的任何引用:
http://www.rubydoc.info/github/jnicklas/carrierwave/CarrierWave/Mount:mount_uploader
在最新的稳定版本(0.11)的源代码中也没有提到:
你确定你没有把它与支持它的CarrierWave :: Uploader :: Versions :: ClassMethods#version方法混在一起吗?