estoy trabajando con ActiveAttr que le da ese bonito initialize través de la opción de bloque:fregado un bloque de una llamada a super
person = Person.new() do |p|
p.first_name = 'test'
p.last_name = 'man'
end
Sin embargo, en una clase específica que incluye ActiveAttr :: Modelo, quiero omitir esta funcionalidad ya que quiero usar el bloque para otra cosa. Así que aquí vamos:
class Imperator::Command
include ActiveAttr::Model
end
class MyCommand < Imperator::Command
def initialize(*args, &block)
@my_block = block
super(*args)
end
end
Esta falla estrepitosamente, porque el bloque aún se transmite en la cadena, y, finalmente, en el interior de ActiveAttr, este código se ejecute:
def initialize(*)
super
yield self if block_given?
end
Así que si mi llamada parece por lo que:
MyCommand.new() { |date| date.advance(month: 1) }
se produce un error de la siguiente manera:
NoMethodError: undefined method `advance' for #<MyCommand:0x007fe432c4fb80>
ya que MyCommand no tiene ningún método: anticípelo, la llamada a MyCommand obviamente falla.
Así que mi pregunta es esta, ¿hay alguna manera de que pueda eliminar el bloque de la firma del método antes de llamar al super
nuevamente, para que el bloque no viaje más allá de mi inicializador anulado?
Perfecto, no sé por qué no pensé en eso. ¡Gracias! – TheDelChop
Esto debe ser un error de rubí, aunque todavía está presente en ruby 2.0 – Mikey