Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamically include modules in another module in Rails

I want to dynamically include all modules within a certain folder into this other module. My code is as follows:

module Extensions
  module ProductExtension
    def add_included_extensions
      extensions = Pathname.glob("lib/extensions/merchant/*.rb")
        .map(&:basename)
        .collect{|x| 
          x.to_s.gsub(".rb", "")
          .titleize.gsub(" ","")
        }

      extensions.each do |merchant|
        include "Extensions::MerchantExtensions::#{merchant}".constantize
      end
    end
    def add_items
      add_included_extensions
      Merchant.all.each do |merchant|
        send("add_#{merchant.name.downcase}_items")
      end
    end
  end
end

However it doesn't seem to be actually including the files because when I call the send method, it says the method it's calling doesn't exist. Any idea what I could be doing wrong?

like image 819
JustNeph Avatar asked May 10 '13 21:05

JustNeph


1 Answers

The problem is you include your modules inside instance methods, so they are not included in the class.

Try:

self.class.send(:include, "Extensions::MerchantExtensions::#{merchant}".constantize)
like image 196
mikdiet Avatar answered Nov 14 '22 23:11

mikdiet