Estos son métodos de clase o métodos 'singleton'. Uno con el que debe estar familiarizado es attr_accessor. Podemos implementar algo así en una clase de prueba.
class Klass
def self.add_getter_and_setter(symbol)
module_eval "def #{symbol}; @#{symbol}; end"
module_eval "def #{symbol}=(val); @#{symbol} = val; end"
end
end
class Person < Klass
add_getter_and_setter :name
add_getter_and_setter :phone
end
person = Person.new
person.name = 'John Smith'
person.phone = '555-2344'
person # returns <Person:0x28744 @name="John Smith", @phone="555-2344">
En el ejemplo anterior hemos creado el método de clase con 'def self.add_getter_and_setter', pero esto no es la única manera.
class Klass
class << self # opens the singleton class
def add_getter_and_setter(symbol) # note we dont specify self as it is already within the context of the singleton class
..
end
end
end
Uso de extender. Module # extends es un método que amplía una clase con métodos de clase, así como el método Module #include incluye una clase con métodos de instancia.
class Klass
extend(Module.new do
def add_getter_and_setter(symbol)
..
end
end)
end
Si Klass ya se ha definido, podemos volver a abrirlo para agregar métodos de clase
class Klass
end
def Klass.add_getter_and_setter(symbol)
..
end
# or
class << Klass
def add_getter_and_setter(symbol)
..
end
end
Bueno esas son algunas de las formas que conozco cómo hacer esto así que si ves sintaxis diferente sólo se dan cuenta es todo haciendo lo mismo
Nota: en los rieles, un método de clase común que todos usamos es 'encontrar'. Se ejecuta directamente fuera de la clase Modelo.
person = Person.find(1) # finds a person with id:1
Una gema también funciona. –