ddd
ddd

Reputation: 155

How to pass methods to the services from module where they are used ?(ruby)

For example, I have main_file.rb

 module Exporter
   extend self

   def transfer(params1, params2)
     Services::Transfer.call(params1, params2)
   end

   def get_sender(params1)
     #some_code
   end
 end

and services/transfer.rb

module Services
  module Transfer
    def self.call(params1, params2)
      sender = get_sender(params1)
      #some_code
    end
  end
end

And i can't define get_sender method exactly in services/transfer.rb as it is used in other services like services/transfer.rb.

Upvotes: 0

Views: 69

Answers (2)

Aleksei Matiushkin
Aleksei Matiushkin

Reputation: 121000

First of all, you do not need to extend self. Either use module_method to declare methods as both module and instance, or, which is in your case more appropriate, use an explicit module function declaration.

module Exporter
 def self.transfer(*params)
   Services::Transfer.call(self, :get_sender, *params)
 end

 def self.get_sender(params1)
   #some_code
 end
end

module Services
  module Transfer
    def self.call(receiver, method, *params)
      sender_param, *other_params = params
      sender = receiver.public_send(method, sender_param)
      #some_code
    end
  end
end

This approach is more generic and probably should suit your needs.

Upvotes: 2

m3characters
m3characters

Reputation: 2290

If what you want is to use Exporter's method get_sender() on other modules you can:

module Services
  module Transfer
    include Exporter
    def self.call(params1, params2)
      sender = get_sender(params1)
      #some_code
    end
  end
end

This allows you to use directly get_sender() inside the module, or Services::Transfer.get_sender(), actually any method in Exporter (which is being 'include'd) will be available to the module/class including it.

Upvotes: 0

Related Questions