CarrierWave делает потрясающую работу с ActiveRecord, изменяя размеры моих изображений, когда я их загружаю, - но я хотел бы иметь возможность записывать, является ли изображение пейзажем или портретом в моей модели ActiveRecord при его обработке - возможно ли это?CarrierWave для обновления модели?
0
A
ответ
1
С README, вы можете использовать следующие определения ориентации изображения:
def landscape?(picture)
image = MiniMagick::Image.open(picture.path)
image[:width] > image[:height]
end
Вы могли бы использовать это в a before_save
на вашей модели, например, в this example из вики-носителя CarrierWave, который я немного адаптировал:
class Asset < ActiveRecord::Base
mount_uploader :asset, AssetUploader
before_save :update_asset_attributes
private
def update_asset_attributes
if asset.present? && asset_changed?
self.landscape = landscape?(asset)
end
end
def landscape?(picture) # ... as above ...
end
Обновление: Чтобы сделать это в загрузчике, я не уверен в лучшем подходе. Одним из вариантов может быть написать метод обработки пользовательских:
class AssetUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
process :resize => [200, 200]
private
def resize(width, height)
resize_to_limit(width, height) do |image|
model.landscape = image[:width] > image[:height]
image
end
end
end
, который использует тот факт, что методы MiniMagick yield
изображение, для дальнейшей обработки, с тем чтобы избежать загрузки изображения во второй раз.
1
вы можете добавить этот метод в файл загрузчика:
include CarrierWave::RMagick
def landscape? picture
if @file
img = ::Magick::Image::read(@file.file).first
img.columns > img.rows
end
end
Смежные вопросы
- 1. Тестирование модели с Carrierwave uploder
- 2. Доступ к атрибуту модели в модуле CarrierWave во время обновления модели
- 3. CarrierWave удаленная загрузка из модели не контроллер
- 4. Получение имени файла через Carrierwave в модели
- 5. Multiple Carrierwave mount_uploader на одной модели
- 6. Проверка модели не для обновления
- 7. Удалить файл CarrierWave из связанной модели
- 8. Carrierwave путь файла, хранящегося в связанной модели
- 9. Carrierwave - Как ссылку на образ модели с другой модели
- 10. Carrierwave не загружает изображение для модели с помощью другого контроллера
- 11. CarrierWave cache_dir find nil для связи с принадлежностью модели
- 12. Информ ViewModel обновления модели?
- 13. AngularJS ngПрименение модели обновления
- 14. Обнаружение обновления модели
- 15. angularjs обновления элементов модели
- 16. Обновления после модели привязки
- 17. WPF TreeView обновления, когда источник обновления для модели дерева
- 18. Использовать разные загрузчики CarrierWave для одной модели на основе атрибутов другой модели - RAILS
- 19. Как использовать UpdateView для обновления модели Django?
- 20. Django: Используйте LayerMapping для обновления существующей модели?
- 21. Привязать словарь к модели SQLAlchemy для обновления
- 22. Проблемы с ngChange для обновления модели
- 23. Ajax и ModelForm для обновления модели
- 24. Force BindingSource для обновления данных/модели
- 25. Сопоставление плагина слишком долго для обновления модели
- 26. Попутный PARAMS для создания и обновления модели
- 27. обновления переменного экземпляр без обновления модели рельсы
- 28. Обновления экземпляра модели
- 29. Модели Обновления Django- объекты
- 30. Изменение атрибутов блоков Carrierwave?
Я дал этот снимок - он действительно работает, но для этого требуется загрузить изображение дважды, один раз для изменения размера и один раз, чтобы найти ширину и высоту - это похоже на плохое использование памяти! Невозможно ли получить эту информацию из загрузчика, а не из модели? –
Да, это определенно возможно. Я добавил возможный подход к моему ответу. –
awe- * Мне нужно написать больше символов * -которые –