Rails - 如何在模型中使用if语句?

时间:2016-05-26 08:00:54

标签: ruby-on-rails ruby ruby-on-rails-4 carrierwave rails-models

我已安装了carrierwave gem用于图片上传。我需要将mount_uploader :value, CheckItemValueImageUploader应用于valuesvalue_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语句应该解决这个问题。我不知道为什么第二个选项不起作用,但我确定它的一些随机原因超出了我在轨道上的知识范围。我真的希望有人在这里有一个有效的解决方案。

2 个答案:

答案 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)的源代码中也没有提到:

https://github.com/carrierwaveuploader/carrierwave/blob/17ae595237339ea9372aa4b9144387c5041b32f0/lib/carrierwave/mount.rb

你确定你没有把它与支持它的CarrierWave :: Uploader :: Versions :: ClassMethods#version方法混在一起吗?

http://www.rubydoc.info/github/jnicklas/carrierwave/CarrierWave/Uploader/Versions/ClassMethods#version-instance_method