Rails - Как я могу иметь оператор if в модели?

У меня установлен самоцвет для передачи изображений. Мне нужно подать заявку mount_uploader :value, CheckItemValueImageUploader в values с value_type равно 3, Вот что я попробовал.

Приведенный ниже код не выдает никаких ошибок, он также, похоже, не имеет никакого значения, как если бы в операторе if его не было.

mount_uploader :value, CheckItemValueImageUploader, if: 'value_type == 3'

Я попробовал код ниже, который работает для не типов изображений (что-нибудь с value_type кроме 3), но сохраняет изображения как #<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

Само по себе без какого-либо заявления mount_uploader :value, CheckItemValueImageUploader Сохраняет изображения просто отлично, но любой другой тип значения не сохраняет (например, текст), оператор if должен это исправить. Я не знаю, почему второй вариант не работает, но я уверен, что это какая-то случайная причина, которая выходит за рамки моих знаний о рельсах. Я действительно надеюсь, что у кого-то здесь будет рабочее решение.

2 ответа

Обычно вы должны использовать блок:

mount_uploader :value, CheckItemValueImageUploader, if: proc { |o| o.value_type == 3 }

где o это экземпляр модели.

Но правильным способом использования поля signle для различных целей является использование STI, поэтому у вас будет один родительский класс для таблицы и подклассы для различных случаев:

app / models / base_model.rb:

class BaseModel < AR::Base
end

app / models / base_models / pic.rb:

class Pic < BaseModel
   mount_uploader :value, CheckItemValueImageUploader # value as an image
end

app / models / base_models / text.rb:

class Text < BaseModel
   # value as a string
end

Обратите внимание, что вы должны добавить type поле к base_models Таблица.

Я не могу найти ссылку на параметр if: в документации по методу mount_uploader по адресу:

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

Другие вопросы по тегам