carrierwave-base64 icon indicating copy to clipboard operation
carrierwave-base64 copied to clipboard

try to use carrierwave-base64 with nobrainer

Open arabakevin opened this issue 5 years ago • 4 comments

Hi, i would like adapt this gem with noBrainer https://github.com/y9v/carrierwave-base64 to upload a file in Base64. So, i update this file https://github.com/y9v/carrierwave-base64/blob/master/lib/carrierwave/base64/railtie.rb and here we can see what has been changed

module Carrierwave
  module Base64
    # Railtie class to load the carrierwave-base64 adapters
    # Loads adapters for ActiveRecord and Mongoid
    class Railtie < Rails::Railtie
      ActiveSupport.on_load :active_record do
        ActiveRecord::Base.extend Carrierwave::Base64::Adapter
      end

      ActiveSupport.on_load :mongoid do
        Mongoid::Document::ClassMethods.include Carrierwave::Base64::Adapter
      end

      ActiveSupport.on_load :nobrainer do
        puts("extending NoBrainer ...")
        NoBrainer::Document::ClassMethods.include Carrierwave::Base64::Adapter
      end
    end
  end
end

I have found ActiveSupport.onload :nobrainer when i use in console this command

irb(main):011:0> ActiveSupport.instance_variable_get(:@loaded).keys()
=> [:i18n, :after_initialize, :before_eager_load, :action_view, :active_record, :mongoid, :nobrainer, :action_controller, :before_configuration, :action_mailer, :before_initialize, :active_job, :action_dispatch_integration_test, :action_controller_base, :active_support_test_case, :action_cable, :action_cable_channel, :action_cable_connection, :action_controller_api, :devise_controller, :devise_failure_app]

and when I use

irb(main):016:0> ActiveSupport.instance_variable_get(:@loaded)[:nobrainer]
=> []

nobrainer doesn’t seem to be loaded. Moreover, I’m using the classNoBrainer::Document::ClassMethods like it is used in https://github.com/nviennot/carrierwave-nobrainer/blob/master/lib/carrierwave-nobrainer.rb line 150.

When I start my server, I can’t see the puts message, and I have the error message “mount_base64_uploader not defined” like if ActiveSupport.on_load(:nobrainer) was not executed.

Am I missing something? Can you please help me?

Thanks for your help.

arabakevin avatar Jul 24 '20 20:07 arabakevin

Hi @arabakevin!

Did you try to use the include directly, without using ActiveSupport?

NoBrainer::Document::ClassMethods.include Carrierwave::Base64::Adapter

y9v avatar Jul 26 '20 18:07 y9v

Hi @y9v , I've already found a workaround to use the library. I use an initializers in my config/initializers/carrierwave_base64.rb, we can see

NoBrainer::Document::ClassMethods.include Carrierwave::Base64::Adapter

It's the same than you propose. But my issue is not to found a workaround but found a solution about the method on_load. This method not working with NoBrainer and I would like know if you have an idea about that. Thanks. Thanks again for your answwer.

arabakevin avatar Jul 28 '20 19:07 arabakevin

Ok, thanks for the update.

To be honest, I have no clue. I did a quick check, and couldn't find anything. I would try to come back to this issue later this week

y9v avatar Jul 28 '20 19:07 y9v

I think the problem is on nobrainer side. it doesn't call the hook like active_record and mongoid do. https://github.com/rails/rails/blob/99bd1d229ae72c4b8428d4f174a7fe35b5e20de4/activerecord/lib/active_record/base.rb#L333 https://github.com/mongodb/mongoid/blob/eaa6d26467e7fb15d46867bed676d4e59317e738/lib/mongoid/document.rb#L344 https://api.rubyonrails.org/classes/ActiveSupport/LazyLoadHooks.html

sangnuce avatar Dec 20 '21 15:12 sangnuce