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):
Вы уверены, что не путаете это с методом CarrierWave::Uploader::Versions::ClassMethods#version, который поддерживает это?
http://www.rubydoc.info/github/jnicklas/carrierwave/CarrierWave/Uploader/Versions/ClassMethods