cloudinary / cloudinary_gem

Cloudinary GEM for Ruby on Rails integration
https://cloudinary.com
420 stars 285 forks source link

Invalidate cache in CarrierWave uploader? #314

Open sandric opened 6 years ago

sandric commented 6 years ago

Hi, I having strange issue that I found many people struggle with through out issues, but I havent found how to make it using carrierwave. My problem is that if I have cloudinary carrierwave uploader on field in model and currently that field is nil and I upload new image using just simple_form form submit - it appears in cloudinary dashboard and as actual field in model so I can see uploaded image on site. Issue occurs when I want to update existing image on model - after model.update_attributes call with say logo parameter from form submitted, I see new image occurs in dashboard and old one is gone, however, my model still having old image in its field, so that I see only old image on site.

For example, my model Comany is Neo4j one, and in it is only that:

class Company
  ...
  property :logo
  mount_uploader :logo, CompanyLogoUploader
  ...
end

CompanyLogoUploader:

class CompanyLogoUploader < CarrierWave::Uploader::Base
  include Cloudinary::CarrierWave

  process :convert => 'jpg'

  if Rails.env.development?
    process :tags => ['env.development']
  end

  version :large do
    process :resize_to_fit => [500, 500, :north]
  end

  version :medium do
    process :resize_to_fit => [140, 140, :north]
  end

  version :small do
    process :resize_to_fit => [80, 80, :north]
  end

  version :tiny do
    process :resize_to_fill => [20, 20, :north]
  end
end

Now, if I have company model without logo and upload new one, all is great and here what I see as logo:

[2] pry(main)> Company.find('f0cfdf56-0f72-4184-affb-b37ee5fe097e').logo
=> #<CompanyLogoUploader:0x0055971c014d58
 @file=
  #<Cloudinary::CarrierWave::CloudinaryFile:0x0055971c010e10
   @filename="spikbsjvpx9tkgi78c3w.jpg",
   @format="jpg",
   @identifier="spikbsjvpx9tkgi78c3w.jpg",
   @public_id="spikbsjvpx9tkgi78c3w",
   @resource_type="image",
   @storage_type=nil,
   @uploader=#<CompanyLogoUploader:0x0055971c014d58 ...>,
   @version=nil>,
 @model=
  #<Company uuid: f0cfdf56-0f72-4184-affb-b37ee5fe097e, active_deals_count: 1, company_size: , created_at: 2015-12-17T21:01:24+00:00, deals_count: 1, description: Online HR services: payroll, benefits, and everything else, fundraising_stage: , jobs_count: 1, logo: https://res-3.cloudinary.com/davsupw1h/image/upload/spikbsjvpx9tkgi78c3w.jpg, name: Gusto, negativity_percentage: 0.0, ratings_count: 105, recommendation_percentage: 0.9714285714285714, reviews_count: 35, score: 9.6, screenshot: https://res-2.cloudinary.com/davsupw1h/image/upload/v1451872564/c8ve6qbmu2sqkws3hi2b.jpg, slug: gusto, updated_at: 2018-07-30T12:11:10+00:00, url: http://gusto.com/, url_ref: false, votes_score: 0, wilson_score: 9.4>,
 @mounted_as=:logo,
 @original_filename="spikbsjvpx9tkgi78c3w.jpg",
 @public_id="spikbsjvpx9tkgi78c3w",
 @stored_public_id="spikbsjvpx9tkgi78c3w",
 @stored_version=nil>

[3] pry(main)> Company.find('f0cfdf56-0f72-4184-affb-b37ee5fe097e').logo.url(:medium)
=> "https://res3.cloudinary.com/davsupw1h/image/upload/c_fit,h_140,w_140/spikbsjvpx9tkgi78c3w.jpg"

It appears in dashboard with url: "https://res.cloudinary.com/davsupw1h/image/upload/v1532952671/spikbsjvpx9tkgi78c3w.jpg"

Now, If I'll change this image to smth else, here's updated debug:

[4] pry(main)> Company.find('f0cfdf56-0f72-4184-affb-b37ee5fe097e').logo
=> #<CompanyLogoUploader:0x0055971be73148
 @file=
  #<Cloudinary::CarrierWave::CloudinaryFile:0x0055971be6cdc0
   @filename="spikbsjvpx9tkgi78c3w.jpg",
   @format="jpg",
   @identifier="spikbsjvpx9tkgi78c3w.jpg",
   @public_id="spikbsjvpx9tkgi78c3w",
   @resource_type="image",
   @storage_type=nil,
   @uploader=#<CompanyLogoUploader:0x0055971be73148 ...>,
   @version=nil>,
 @model=
  #<Company uuid: f0cfdf56-0f72-4184-affb-b37ee5fe097e, active_deals_count: 1, company_size: , created_at: 2015-12-17T21:01:24+00:00, deals_count: 1, description: Online HR services: payroll, benefits, and everything else, fundraising_stage: , jobs_count: 1, logo: https://res-3.cloudinary.com/davsupw1h/image/upload/spikbsjvpx9tkgi78c3w.jpg, name: Gusto, negativity_percentage: 0.0, ratings_count: 105, recommendation_percentage: 0.9714285714285714, reviews_count: 35, score: 9.6, screenshot: https://res-2.cloudinary.com/davsupw1h/image/upload/v1451872564/c8ve6qbmu2sqkws3hi2b.jpg, slug: gusto, updated_at: 2018-07-30T12:17:41+00:00, url: http://gusto.com/, url_ref: false, votes_score: 0, wilson_score: 9.4>,
 @mounted_as=:logo,
 @original_filename="spikbsjvpx9tkgi78c3w.jpg",
 @public_id="spikbsjvpx9tkgi78c3w",
 @stored_public_id="spikbsjvpx9tkgi78c3w",
 @stored_version=nil>

[5] pry(main)> Company.find('f0cfdf56-0f72-4184-affb-b37ee5fe097e').logo.url(:medium)
=> "https://res-3.cloudinary.com/davsupw1h/image/upload/c_fit,h_140,w_140/spikbsjvpx9tkgi78c3w.jpg"

Whereas new image that got updated in dashboard has url "https://res.cloudinary.com/davsupw1h/image/upload/v1532953062/spikbsjvpx9tkgi78c3w.jpg" - version is changed.

So my question is next - should I pass version somehow in image uploader, and how/where? If yes then why does carrierwave integration by default does not using version and rely on caching? Can I turn it off somehow, in uploader, in cloudinary initializer? Thanks.

sandric commented 6 years ago

Any ideas?

roeeba commented 6 years ago

Hi @sandric. We've identified the issue - version remains nil after the update instead of been populated with the new version. We'll update as soon as we'll have an ETA for a fix.

sandric commented 6 years ago

Any progress on this? I guess there should be fairly simple in-place fix untill pr with real fix is merged maybe?

roeeba commented 6 years ago

Hi @sandric, no ETA yet as we're still reviewing the issue and possible solutions. We'll update on any progress done.