Reputation: 22296
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
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