Paulo Fidalgo
Paulo Fidalgo

Reputation: 22296

How to refine a method from a class inside a module

I want to refine a methoded located in a class inside a module, but despite the fact of trying to refine the class, I cannot have the refined code to run:

module App
  module Entities
    class User
      def self.name(name)
        puts "Original name: #{name}"
      end
    end
  end
end

module RefinedUser
  refine App::Entities::User do
    def self.name(name)
      puts "Refined name: #{name}"
    end
  end
end

class Runner
  def original
    App::Entities::User.name('Forest')
  end

  using RefinedUser

  def refined
    App::Entities::User.name('Forest')
  end
end

r = Runner.new
r.original
r.refined

Output: Original name: Forest Original name: Forest

Upvotes: 1

Views: 637

Answers (1)

孙悟空
孙悟空

Reputation: 1285

You need to refine App::Entities::User with his singleton_class. Because name is a class method.

App::Entities::User is ok.

module RefinedUser
  refine App::Entities::User.singleton_class do
    def name(name)
      puts "Refined name: #{name}"
    end
  end
end

using RefinedUser

class Runner
  def refined
    App::Entities::User.name('Forest')
  end
end

r = Runner.new
r.refined
=>Refined name: Forest

Upvotes: 1

Related Questions