You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Photo metadata is nil until after AR callbacks have run #499
I'm trying to extract colors from an uploaded image, following the docs on utilizing cloudinary_transformation and an after_save on the model. Unfortunately, metadata seems to always be nil. Once the after_save callback has finished, then source.metadata is populated. This seems like a misplaced lifecycle callback or something.
Issue Type (Can be multiple)
Build - Cannot install or import the SDK
Performance - Performance issues
Behaviour - Functions are not working as expected (such as generate URL)
Documentation - Inconsistency between the docs and behaviour
Other (Specify)
Steps to reproduce
classPhotoUploader < CarrierWave::Uploader::BaseincludeCloudinary::CarrierWavecloudinary_transformationimage_metadata: true,colors: trueendclassPhoto < ApplicationRecordmount_uploader:source,PhotoUploaderafter_save:extract_colorsdefextract_colors# `source.metadata` is `nil`endend
Environment and Libraries (fill in the version numbers)
class ImageUploader < CarrierWave::Uploader::Base
include Sprockets::Rails::Helper
include Cloudinary::CarrierWave
process :tags => ["photo_album_sample"]
process :convert => "jpg"
cloudinary_transformation :image_metadata => true, :colors => true
version :thumbnail do
eager
resize_to_fit(150, 150)
cloudinary_transformation :quality => 80
end
end
And photo model to
class Photo < ActiveRecord::Base
belongs_to :album
mount_uploader :image, ImageUploader
validates_presence_of :title, :image
after_save :extract_colors
def extract_colors
if self.image.present? && self.image.metadata.present?
exif = self.image.metadata["image_metadata"]
colors = self.image.metadata["colors"]
end
end
end
@kris sorry for the delay. So yes after_save needs to be called so that the object is created first. Once the object is created, you can then access image.metadata.
Can you explain what exactly you are trying to achieve?
@tommyg-cld When an image is uploaded, I wanted to have a callback that is triggered on the model to cache the extracted colors from Cloudinary. I was hoping to do this within a callback, but my current solution is to have an operation/service that saves the object, then updates the objects color cache via the mounted image, then call again. Less than ideal compared to an after_save, but I guess this is as good as I'll get.
Activity
tommyg-cld commentedon Sep 30, 2022
@kris I just tested this and I'm unable to replicate it, I'm basically using the
photo_albumsample from https://github.com/cloudinary/cloudinary_gem/tree/master/samples and I just modifiedimage_uploadertoAnd
photomodel toCan you try like that?
kris commentedon Oct 16, 2022
@tommyg-cld Sorry for the late reply. It still doesn't work. Try this:
binding.pryin#extract_colorsimage.metadata-- for me it'snilobject.image.metadataand you will see it's set. The problem is thatmetadataappears to beniluntil after theafter_saveis called.tommyg-cld commentedon Oct 25, 2022
@kris sorry for the delay. So yes
after_saveneeds to be called so that the object is created first. Once the object is created, you can then access image.metadata.Can you explain what exactly you are trying to achieve?
kris commentedon Nov 3, 2022
@tommyg-cld When an image is uploaded, I wanted to have a callback that is triggered on the model to cache the extracted colors from Cloudinary. I was hoping to do this within a callback, but my current solution is to have an operation/service that saves the object, then updates the objects color cache via the mounted image, then call again. Less than ideal compared to an
after_save, but I guess this is as good as I'll get.tommyg-cld commentedon Nov 4, 2022
@kris can you just not use after_save then?
kris commentedon Nov 7, 2022
@tommyg-cld metadata is nil for me in
after_save. I'll create a repo over the next few days to demonstrate.tommyg-cld commentedon May 9, 2023
@kris just following up to check if this is still an issue?