Направляющие: у меня есть метод класса, и я хочу изменить что-то вроде экземпляра
что-то вроде этого:
class Test < Main
template :box
def test
# here I want to access the template name, that is box
end
end
class Main
def initialize
end
def self.template(name)
# here I have to save somehow the template name
# remember is not an instance.
end
end
это подобно образцовым классам:
# in the model
has_many :projects
Как я делаю это?
Править:
class Main
def self.template(name)
@name = name
end
def template
Main.instance_eval { @name }
end
end
class Test < Main
template 6
end
t = Test.new.template
t # t must be 6
Вы придется закусить пулю и изучить метапрограммирование на Ruby. Об этом есть книга.
http://pragprog.com/titles/ppmetr/metaprogramming-ruby
Вот один из способов сделать это.
class M
def self.template(arg)
define_method(:template) do
arg
end
end
end
class T < M
template 6
end
t = T.new
puts t.template
Есть несколько различных способов сделать это. Вот один из них:
class Main
def self.template(name)
@name = name
end
end
class Test < Main
def test
Main.instance_eval { @name }
end
end
Main.template 5
Test.new.test
==> 5