Home > Blockchain >  Rails: Class in same module not found
Rails: Class in same module not found

Time:12-23

I have a problem. I am new to Ruby, so I am struggling with some issues, which I can resolve after a couple hours, but this one is bugging me for a day now.

I created a class in /lib/math/calc.rb with the following content:

module Math
    module Calc
        class << self
            def check!(value1: nil, value2: nil)
                raise Error.new(message: "value1 is required") unless value1
                raise Error.new(message: "value2 is required") unless value2
                Divide.send!(value1: :value1, value2: :value2)
            end
        end
    end
end

Then I also have a class Divide which is located in: /lib/math/calc/divide.rb, with the content:

module Math
    module Calc
        class Divide
            class << self
                def send!(value1: nill, value2: nill)
                    # More code here
                end
            end
        end
    end
end

Now when I call: Math::Calc.check!(5, 5), I get the following error:

NameError: uninitialized constant Math::Calc::Divide

I already tried inserting require 'divide', but those imports do not exist he said.

What am I doing wrong here?

CodePudding user response:

If you wanna do it using plain Ruby you just need to require the Divide file inside of your module, so the intepreter knows where the file is located

File tree:

  • lib/math/calc.rb
  • lib/math/calc/divide.rb
# lib/math/calc.rb
require_relative 'calc/divide'

module Math
  module Calc
    class << self
      def check!(value1: nil, value2: nil)
        raise Error.new(message: "value1 is required") unless value1
        raise Error.new(message: "value2 is required") unless value2
        Divide.send!(value1: :value1, value2: :value2)
      end
    end
  end
end

Aside from that: note that you don't have the Error class defined in there. You also are not actually sending the proper values to Divide.send!. In order to do it you should send Divide.send!(value1: value1, value2: value2)

CodePudding user response:

Maybe try the below.

lib/math/calc.rb

module Math
  module Calc
    require_relative './calc/divide'
    extend self

    def check!(value1: nil, value2: nil)
      raise Error.new(message: "value1 is required") unless value1
      raise Error.new(message: "value2 is required") unless value2
      Divide.send!(value1: :value1, value2: :value2)
    end
  end
end

lib/math/calc/divide.rb

module Math
  module Calc
    class Divide
      def self.send!(value1: nill, value2: nill)
        # More code here
      end
    end
  end
end

Also, maybe create your lib directory inside your app e.g app/lib

  • Related